LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 825|回复: 3

关于进程的一个疑问

[复制链接]
发表于 2006-9-8 16:28:56 | 显示全部楼层 |阅读模式
fork()后 产生子进程。
我杀掉父进程后,父进程会关闭哪些资源,书上说是标准I/O流等,但是我是定向到文件的,然后我在文件中发现,父被杀后,不能输出子进程的输出结果,是否证明父进程被杀,会关闭子所有的I/O流。
但是为了实现守护进程,我用一个for,循环对标准输出打印一句话,却能打印,又证明父没有关掉标准输出?
怎么回事呢?希望能指点一下。

  1. int main(int argc,char **argv)
  2. {

  3.    FILE *fp;
  4.    pid_t pid;
  5.    if((fp=fopen("pid.txt","w"))==NULL)
  6.    {
  7.       fprintf(stderr,"%s","open error");
  8.       exit(1);
  9.    }
  10.    if((pid=fork())==-1)
  11.    {
  12.       fprintf(stderr,"%s","fork error");
  13.       exit(1);
  14.    }
  15.    if(pid==0)
  16.    {
  17.       fprintf(fp,"child:my id is:%d,my father's id is:%d\n",getpid(),getppid());
  18.    }
  19.    else
  20.    {
  21.       sleep(5);
  22.       fprintf(fp,"father:my child id is:%d,my id is:%d,my father's id is:%d\n",pid,getpid(),getppid());
  23.       exit(0);
  24.    }
  25.    for(;;)
  26.    {
  27.       sleep(2);
  28.       printf("child is here\n");
  29.    }
  30. }
复制代码
发表于 2006-9-8 16:55:32 | 显示全部楼层
这个for是不是便成了父子共同的代码?
if(pid=0){}执行完后你没有exit,于是child继续执行for()了

父进程关掉了他自己的stdout,子进程的stdout没关
我看就是这样
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-8 17:40:58 | 显示全部楼层
不可能 我已经在父进程里用exit终止了父。 留下的子进程将继续执行for.
关键问题是,如果我本来以前做的时候,发现不用for,然后在程序最后加上exit来终止父子进程,这样,有可能父进程先执行,由于被终止,子进程会认INIT进程做父,于是我在父进程里加上sleep,让子进程先执行,这样打印出来的结果可以发现,子执行完时,PPID依然是父进程,于是,在这个程序里 我同样加上SLEEP,以为,结果中可以打印出子进程。但是即便是这样,也没有打印。显然,父进程是等到exit后 再执行的子进程,并关闭了它的IO流资源。
对于for中可以对stdout输出,我的理解是,领养它的init进程给他的资源。不知有没有理解错?
于是问题变成,到底使用sleep,能不能让子进程先行,为什么不加for就可以,而加了for后就不行?并且,我把sleep改为wait后,我人工kill掉子进程,然后发现,父与子都没有被打印,足以证明,父子的资源是共享的,关闭任何一个,都导致另一个出问题?
请问高手可以指点我的疑惑,并且我的判断是否正确?
回复 支持 反对

使用道具 举报

发表于 2006-9-11 20:25:41 | 显示全部楼层
ok, 简单说下吧.
父进程既然留了些什么给后人,在自己西游的时候自然不会再收回去,那你所遇到的情形又是为何呢? OS 为了效率,一般对 i/o 的读写都会有缓冲,也就是如若不是很必要, os 宁可把数据放在内存来提高效率而产生临时的不一致. 如此,情况就很明了了,如果你在子进程的
  1. fprintf(fp,"child:my id is:%d,my father's id is:%d\n",getpid(),getppid());
复制代码
后加上一句
  1. fflush(fp);
复制代码
那又当如何呢?

话到此,已明晰
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表