Joh*_*lak 13 c jobs signals process foreground
我正在尝试给孩子进程(通过fork())前台访问终端.
在我之后fork(),我在子进程中运行以下代码:
setpgid(0, 0);
Run Code Online (Sandbox Code Playgroud)
和:
setpgid(child, child);
Run Code Online (Sandbox Code Playgroud)
在父进程中.
这为孩子提供了自己的过程组.呼叫setpgid()正常工作.
现在我想让孩子访问终端.
我在setpgid()电话会议后给孩子添加了以下内容:
if (!tcsetpgrp(STDIN_FILENO, getpid())) {
perror("tcsetpgrp failed");
}
Run Code Online (Sandbox Code Playgroud)
之后,有一个execv()命令产生/usr/bin/nano.
然而,nano没有发生任何事情,终端看起来好像它期待用户输入.
此外,tcsetpgrp()呼叫后似乎没有代码执行.
我在某处读到了我需要向SIGCONT子进程发送信号以使其工作.如果该过程停止,我该怎么办?父母是否必须发送信号?
SIGCONT如果这是解决方案,我该如何发送信号?
raise(SIGCONT);
Run Code Online (Sandbox Code Playgroud)
此外,我不确定这是否有帮助,但代码工作正常,并生成nano如果我运行我的程序:
exec ./program
Run Code Online (Sandbox Code Playgroud)
代替:
./program
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?非常感谢!
弄清楚了.我必须忽略任何SIGTTOU信号.
我这样做是通过添加:
signal(SIGTTOU, SIG_IGN);
Run Code Online (Sandbox Code Playgroud)
在tcsetpgrp()通话之前.
man 3 tcsetpgrp说:
如果tcsetpgrp()在其会话中由后台进程组的成员调用,并且调用进程未阻止或忽略SIGTTOU,则会向此后台进程组的所有成员发送SIGTTOU信号.
您需要在父进程中调用tcsetpgrp()而不是在子进程中.但是,如果您的父进程已启动并移至后台,则它将收到SIGTTOU并将被停止.