我试图给一个子进程(通过fork())提供对终端的前台访问。
在我fork()之后,我在子进程中运行以下代码:

setpgid(0, 0);

以及:
setpgid(child, child);

在父进程中。
这将为子进程组提供自己的进程组。调用setpgid()可以正常工作。
现在我想让孩子进入终端。
setpgid()调用之后,我向孩子添加了以下内容:
if (!tcsetpgrp(STDIN_FILENO, getpid())) {
    perror("tcsetpgrp failed");
}

之后,有一个execv()命令来生成/usr/bin/nano
然而,没有出现nano,什么也没有发生,终端看起来好像在期待用户输入。
此外,在tcsetpgrp()调用之后似乎没有代码执行。
我在某个地方看到,我需要向子进程发送一个SIGCONT信号以使其工作。如果进程被停止,我该怎么做?家长必须发信号吗?
如果这是解决方案,我如何发送SIGCONT信号?
raise(SIGCONT);

另外,我不确定这是否有帮助,但是如果我使用以下命令运行我的程序,代码可以正常工作并生成nano
exec ./program

而不是:
./program

有什么想法吗?非常感谢!

最佳答案

man 3 tcsetpgrp声明:
如果tcsetpgrp()由后台进程组的成员在其会话中调用,并且调用进程没有阻塞或忽略sigttou,则会向该后台进程组的所有成员发送sigttou信号。
您需要在父进程而不是子进程中调用tcsetpgrp()。但是,如果父进程启动并移到后台,它将收到sigttou并停止。

08-17 23:38