为什么在setid()之前需要fork(),即使子进程不是组长?

时间:2019-02-13 22:31:12

标签: unix daemon

在创建守护程序时,我们都知道在setid()之前进行fork()的原因是使子进程不再是进程组的负责人,因为我们需要调用setsid()。

我的问题是,为什么父流程可能是流程组负责人?如果fork()将使子进程不成为组长,那么为什么父进程是组长?因为父流程是由宏流程分叉的?

谢谢!

1 个答案:

答案 0 :(得分:1)

shell完成它。

交互式shell将使每个执行的程序成为其自己的进程组负责人,以启用作业控制(命令的前台和后台)。

这是Implementing a Job Control Shell上GNU文档的摘录:

  

在分叉每个进程时,应通过调用setpgid [...]

将其置于新进程组中
if (shell_is_interactive)
  {
    /* Put the process into the process group and give the process group
     the terminal, if appropriate.
     This has to be done both by the shell and in the individual
     child processes because of potential race conditions.  */
  pid = getpid ();
  if (pgid == 0) pgid = pid;
  setpgid (pid, pgid);
  if (foreground)
    tcsetpgrp (shell_terminal, pgid);