子进程是前台还是后台在C中的fork

时间:2015-05-27 08:24:39

标签: c linux process fork job-control

当我在fork()上的C中执行Linux时,新创建的子项是前台还是后台进程?

如果默认为前景,有没有办法强制将其创建为后台进程?

我阅读了很多关于fork的链接,但无论是前景还是背景,都没有在任何地方提及。

http://en.wikipedia.org/wiki/Fork_(system_call)

http://linux.die.net/man/2/fork

http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html

3 个答案:

答案 0 :(得分:0)

只需使用下面详述的命令将序列设置为背景或前景。使用 pid = fork()确保您在父或子中执行您想要先设置的任何一个。在父级中,pid将是子级的PID,在子级中它将为0.使用它如下:

if(pid)
// Parent
else
// Child

<强>过程

进程pid由

放入进程组pgid中
setpgid(pid, pgid);

如果pgid == pid或pgid == 0,则会创建一个包含流程组负责人pid的新流程组。否则,这会将pid放入已存在的进程组pgid中。零pid指的是当前进程。调用setpgrp()等同于setpgid(0,0)。

<强>前景

在会话中的进程组中,最多一个可以是该会话的前台进程组。 tty输入和tty信号(由^ C,^ Z等生成的信号)进入此前台进程组中的进程。

进程可以使用tcgetpgrp(fd)确定其会话中的前台进程组,其中fd指的是其控制tty。如果没有,则返回大于1的随机值,该值不是进程组ID。

进程可以使用tcsetpgrp(fd,pgrp)在其会话中设置前台进程组,其中fd表示其控制tty,而pgrp是其会话中的进程组,并且此会话仍与控制关联调用过程的tty。

如何获得fd?根据定义,/ dev / tty指的是控制tty,完全独立于标准输入和输出的重定向。 (还有函数ctermid()来获取控制终端的名称。在POSIX标准系统上它将返回/ dev / tty。)打开控制tty的名称给出文件描述符fd。

<强>背景

会话中非前台进程组的所有进程组都是后台进程组。由于键盘上的用户正在与前台进程交互,因此后台进程应远离它。当后台进程从终端读取时,它获得SIGTTIN信号。通常,这将停止它,作业控制shell会注意并告诉用户,谁可以说fg将后台进程作为前台进程继续,然后此进程可以从终端读取。但是如果后台进程忽略或阻塞SIGTTIN信号,或者其进程组是孤立的(见下文),则read()返回EIO错误,并且不发送任何信号。 (实际上,这个想法是告诉过程现在不允许从终端读取。如果它看不到信号,那么它将看到错误返回。)

当后台进程写入终端时,它可能会收到SIGTTOU信号。 May:即设置必须发生的标志(默认情况下是关闭的)。可以通过

设置标志
% stty tostop

再次通过

清除它
% stty -tostop

并通过

进行检查
% stty -a

答案 1 :(得分:0)

在Linux和许多类似Unix的系统上,您可能希望使用daemon(3)来创建后台daemonized进程。

您可能还想close(2)或重定向所有 stdin stdout stderr (也许是/dev/null },请参阅null(4))使用dup2(2)

否则,请注意控制terminalsprocess groupsjob control会话ID。请参阅setpgrp(2)(和setpgid)和 NOTES 部分。使用tcsetpgrp(3)setsid(2)

另请阅读tty demystified页&amp;&amp; tty(4)

答案 2 :(得分:0)

您是否尝试更改代码中的 nice 值?每当你 fork 一个进程时,它就在&#34;背景中。&#34;取决于您的意思,以及您尝试做的事情。