如何让tcsetpgrp()在C中工作?

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)

有任何想法吗?非常感谢!

Joh*_*lak 9

弄清楚了.我必须忽略任何SIGTTOU信号.

我这样做是通过添加:

signal(SIGTTOU, SIG_IGN);
Run Code Online (Sandbox Code Playgroud)

tcsetpgrp()通话之前.


Ves*_*niK 7

man 3 tcsetpgrp说:

如果tcsetpgrp()在其会话中由后台进程组的成员调用,并且调用进程未阻止或忽略SIGTTOU,则会向此后台进程组的所有成员发送SIGTTOU信号.

您需要在父进程中调用tcsetpgrp()而不是在子进程中.但是,如果您的父进程已启动并移至后台,则它将收到SIGTTOU并将被停止.

  • 我读到“当您输入 CTRL-C 时,终端会向前台进程组内的每个进程发送信号。您可以使用“tcsetpgrp(int fd, pid_t pgrp)”更改终端前台的进程组”。现在,我们是在子级 (fork() ==0) 还是父级中执行此操作? (3认同)