首页 > 解决方案 > 为什么将 SIGTTOU 信号传递给进程?

问题描述

我试图构建一个在 ZSH shell 中运行的交互式 shell。任何命令都将在它自己的进程组中执行(因此我使用tcsetpgrpcall 使其成为前台进程组,一旦执行命令,交互式 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);
        }


    }

}

这是我在终端上看到的输出: 在此处输入图像描述

标签: cshellsignalsjob-control

解决方案


/bin/ls对标准输出的写入,由于它的标准输出没有被重定向,它会写入终端。


推荐阅读