gpt4 book ai didi

c - 当调用者属于后台进程时,tcsetpgrp() 是否成功?

转载 作者:太空宇宙 更新时间:2023-11-04 03:19:45 25 4
gpt4 key购买 nike

根据POSIX specification , tcsetpgrp 可以导致 SIGTTOU 被发送到调用进程的组,如果它是后台进程。

但是我不明白在这种情况下是否更改了前景组。

此外,如果尽管信号生成但前景组实际上发生了变化,我想知道如果新的前景组是将要接收 SIGTTOU 的 session 和终端会发生什么.

最佳答案

TL:DR:

不,前景组不会改变。这是有道理的,因为应该在进程更改终端上的设置时发送信号——输出操作。如果更改成功,信号也不会传递给进程(现在是前台组),因为如果没有人发送 SIGCONT,它可能会卡住。

更长的答案:

一个简单的例子:

#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <signal.h>


void sig(int signo) {
const char* msg = strsignal(signo); // XXX: Not async-signal-safe.
write(STDOUT_FILENO, msg, strlen(msg));
write(STDOUT_FILENO, "\n", 1);
}

int main() {
char cntl_tty[L_ctermid];
ctermid(cntl_tty);

signal(SIGTTOU, sig);
signal(SIGCONT, sig);

int fd = open(cntl_tty, O_RDONLY);
if (fd == -1) {
perror("open");
exit(1);
}
if (tcsetpgrp(fd, getpgrp()) == -1) {
perror("tcsetpgrp");
} else {
puts("foregrounded");
}
return 0;
}

当此代码作为后台进程启动并处理 SIGTTOU 时,此循环将永远打印接收到信号。 perror 永远不会被调用,这意味着内核重新启动系统调用。发送 SIGCONT 无关紧要。前景永远不会成功。但是,当通过 shell 将代码置于前台时,会按预期打印“foregrounded”。

SIGTTOU 的信号配置更改为 SIG_IGN 时,会立即打印“foregrounded”。

关于c - 当调用者属于后台进程时,tcsetpgrp() 是否成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47598883/

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