tcsetpgrp在C这个非常短的程序中的神秘行为

时间:2016-06-18 04:15:09

标签: c linux shell fork jobs

这是2个版本的程序完整代码

#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
int main(){
    pid_t pid = fork();
    if (pid){
        setpgid(pid, pid);
        tcsetpgrp(STDIN_FILENO, pid);
        int status;
        waitpid(pid, &status, WUNTRACED);
        puts("waitdone");
        //in second version: uncomment the next line
        //tcsetpgrp(STDIN_FILENO, getpgrp());
        while(1);
    }else{
        //child
        while(1);
    }
    return 0;
}

我对该程序的2个版本有2个问题

  1. 运行第一个版本程序后,按ctrl-c,打印出waitdone。以下ctrl-c不会中断主进程 - &gt;程序卡住,再也无法被ctrl-c打破。为什么shell不会忽略父进程并在父进程不再处于前台时在第一个ctrl-c之后立即返回提示?

  2. 在第二个版本(第二个tcsetpgrp取消注释)中,在第一个ctrl-c之后,父进程似乎被sigtstp停止了。 Shell打印出'./a.out' has stopped并返回提示。 之后,可以使用fg恢复主程序。这一次,ctrl-c会停止父进程的while(1);。为什么在第二个版本中,父进程的tcsetpgrp不会阻止shell返回提示符?

  3. PS:我正在实施迷你外壳。在花了很多时间进行研究和调试之后,我将代码缩减到了这个简短的程序。

    请帮忙。 非常感谢提前

0 个答案:

没有答案