【发布时间】:2019-11-03 00:07:44
【问题描述】:
我知道这个问题之前在 here 和 here 中被问过。但我觉得答案并没有完全解决我的困惑。
假设我正在实现自己的 shell。默认情况下,我会将每个进程置于后台。代码sn-p如下:
pid_t rc = fork();
if (rc > 0) {
int status =
setpgid(rc, rc);
tcsetpgrp(STDIN_FILENO, getpgrp());
} else if (rc == 0) {
reset_signal_handlers(); // this reset all signal handlers to default
setpgrp();
execv(args[0], args);
}
根据我的理解,SIGTTOU 子进程中的默认信号处理程序是暂停它。所以当子进程试图打印到终端时,它应该因为信号而停止。为什么还能打印?
wikipedia 中写道:
Shell 通常会覆盖 SIGTTOU 的默认停止操作,以便后台进程默认将其输出传递到控制终端。
但我正在实现自己的 shell,并且我没有覆盖子进程中的任何处理程序。为什么SIGTTOU 信号仍然被忽略?
【问题讨论】: