Fork,exec - >人。不能正常工作

时间:2010-12-12 15:05:12

标签: unix process

在这种情况下,我写了一个简单的编程:

int main()
{
  pid_t chpid;
  chpid=fork();
  if(chpid==0) // child
  {
    sleep(2);
    execlp("/usr/bin/man","/usr/bin/man","ps",NULL);
    printf("still alive\n");
  }
  else
  {
    printf("parent goes down\n");
  }
  return 0;

}

在运行父母死亡时在2秒内我得到:/usr/bin/man: command exited with status 1: pager -s

为什么这样运行?肯定问题是父母的死,如果我在父母的代码中添加while(1)一切都很好。

我写了一个test-prog,它会在每个时间段内将一些字符串写入标准输出。有用。看起来很奇怪。

3 个答案:

答案 0 :(得分:1)

当孩子正在跑步时从父母那里退出,你刚刚守护了孩子。守护进程及其分支没有控制终端,这是寻呼机运行的要求(我相信pager -sless(1),但检查它:man pager)。

另一方面,即使对于一个守护进程,写STDOUT也不是犯罪,尽管不能保证有人会在那里读取输出。

有关更好的解释,请参阅Richard Stevens关于流程组,会话和控制终端的“Advanced Programming in the UNIX Environment”。

答案 1 :(得分:0)

使用wait(3p)等待孩子死亡。

答案 2 :(得分:0)

因此。一个小小的研究表明,shell已经启动了我的进程,它通过setpgid()设置控制终端(我的proc)。当它死亡时,shell会再次调用setpgid(),尽管我的proc已经fork所有的孩子。所以他们已经是守护进程了。正如我所发现的,守护进程也可以做一些输出例程,但它们并不一定能成功。可能是,可能不是。这就是为什么孩子在父母去世后仍可以输出的原因(例如,如果我分叉一个简单的piriodical writong hello world程序)。而且男人明白,他的产出会随之而来,并开始恐慌。这就是我看到它的方式。

至于strace,它很简单:在我的程序的所有生命周期中,strace仍然存在,所以输出没有问题。