我试图给一个子进程(通过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并停止。