我试图构建一个在 ZSH shell 中运行的交互式 shell。任何命令都将在它自己的进程组中执行(因此我使用tcsetpgrp
call 使其成为前台进程组,一旦执行命令,交互式 shell 将成为前台进程组)。但是我观察到,在我的代码执行过程中,我收到了一个 SIGTTOU 信号,据我所知,当后台进程尝试写入终端时,会传递该信号。对于下面的示例,如果有人可以解释上述信号的原因,那将非常有帮助。
最小的可重现示例
#include <sys/types.h>
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{
for(;;){
printf(">Network shell\n");
int par = getpid();
int child = fork();
if(child == 0){
int c2 = fork();
if(c2 == 0){
char * args[2];
args[0]="/bin/ls";
args[1] = NULL;
execv(args[0], args);
}
else{
wait(NULL);
tcsetpgrp(STDIN_FILENO, par); //done to bring previous process group back to foreground
tcsetpgrp(STDOUT_FILENO, par);
}
}
else{
setpgid(child, child);
tcsetpgrp(STDIN_FILENO, child);
tcsetpgrp(STDOUT_FILENO, child);
wait(NULL);
}
}
}