免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1538 | 回复: 0
打印 上一主题 下一主题

关于初始化精灵进程的分析(aupe中的程序13-1.c) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-20 12:22 |只看该作者 |倒序浏览
初看stevens的《unix环境高级编程》,希望在这里与大家交流和学习,请不吝指教!

代码:
#include  <sys/types.h>;
#include  <sys/stat.h>;
#include  <fcntl.h>;
#include  "ourhdr.h"

int   daemon_init(void);

int   main(void)
{
   int   n;

   if((n = daemon_init()) < 0)
   {
       return -1;
   }

   sleep(;

   printf("sleep is over\n";
   printf("process ID is %d\n", getpid());
   printf("process` parents ID is %d\n",getppid());

   exit(-1);
}

int   daemon_init(void)
{
   pid_t   pid;

   if((pid = fork()) < 0)
   {
       return  -1;
   }

   else if(pid != 0)
   {
       exit(0);
   }

   setsid();

   chdir("/";

   umask(0);

   return(0);
}

运行环境:
hp-ux rx4640   cc编译器

分析:
程序中,精灵进程通过setsid()函数关闭了从父进程继承来的控制终端(没有了控制终端),创建了新的对话期(session)和进程组(此精灵进程成为对话期的首进程(session leader)和新进程组的组长进程);通过chdir()函数改变当前工作目录;通过umask()函数重设文件创建掩码 ;程序没有关闭文件描述符0、1、2。


根据程序的执行结果分析,父进程执行终止后,返回到shell命令行状态,子进程睡眠八秒钟后执行
sleep is over
process ID is 11786
process` parents ID is 1
后执行了exit(0)函数。

没有返回到shell命令行的原因是精灵进程所在的会话期没shell进程组。输出sleep is over
process ID is 11786
process` parents ID is 1
是因为调用了继承父进程的文件描述符1。

控制终端和文件描述符0、1、2有关系,也就是说文件描述符1的标准输出是输出到控制终端。

精灵进程通过继承父进程的文件描述符1把
sleep is over
process ID is 11786
process` parents ID is 1
输出到了父进程的控制终端,而精灵进程的终端被关闭了。

如果精灵进程从父进程继承来的文件描述符不被关闭的话,是很危险的。

运行结果:

未命名副本.gif (4.36 KB, 下载次数: 32)

未命名副本.gif
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP