当我在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
答案 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)。
否则,请注意控制terminals,process groups,job control会话ID。请参阅setpgrp(2)(和setpgid
)和 NOTES 部分。使用tcsetpgrp(3),setsid(2)
另请阅读tty demystified页&amp;&amp; tty(4)
答案 2 :(得分:0)
您是否尝试更改代码中的 nice 值?每当你 fork 一个进程时,它就在&#34;背景中。&#34;取决于您的意思,以及您尝试做的事情。