gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:48 26 4
gpt4 key购买 nike

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

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

我通读了很多关于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

最佳答案

使用我在下面详述的命令简单地将序列设置为背景或前景。使用 pid = fork() 确保您在父级或子级中执行您想先设置的那个。在 parent 中,pid 将是 child 的 PID,在 child 中它将是 0。像这样使用它:

if(pid)
// Parent
else
// Child

过程

一个进程pid被放入进程组pgid中

setpgid(pid, pgid);

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

前景

一个session中的进程组中至多有一个可以是该session的前台进程组。 tty 输入和 tty 信号(由 ^C、^Z 等生成的信号)进入该前台进程组中的进程。

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

一个进程可以使用tcsetpgrp(fd,pgrp)在它的session中设置前台进程组,其中fd指的是它的控制tty,pgrp是它session中的一个进程组,这个session仍然关联到controlling调用进程的tty。

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

背景

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

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

% stty tostop

再次清除它

% stty -tostop

检查它

% stty -a

关于c - C中fork的子进程是前台还是后台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30476971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com