通过ctrl- \终止子进程时,父进程未运行

时间:2019-05-11 17:22:52

标签: c

我正在执行此分配,在该分配中生成了许多子进程,如果它们中止(ctrl- \或ctrl-4),则应代之以运行父进程。这是代码:

int main(int argc, char *argv[])
{

    /* The rest of the code is omitted. "times", "arg1"
    and "cmd1" are parameters passed when running the program */

        for(cont = 0; cont < times; cont++)
        {
                pid = fork();
                if(pid == 0)
                        execvp(arg1,cmd1);
                else if (pid >0) {
                        wait(&status);
                        if (WCOREDUMP(status) !=0)
                                printf("Core dump generado\n");
                }
        }
        return 0;
}

程序多次运行Linux命令,其中argv[1]是次数,而arg[2]argv[3]等是Linux命令本身。

如果未取消,则运行良好。但是当我尝试中止它时(例如使用sleep命令,然后输入ctrl-4):

./ntimes 2 sleep 10
 ^\Quit (Core dumped)

它会生成一个转储。我希望父进程打印一条消息。我已经尝试过信号处理功能和许多其他功能,但是似乎无法使其正常工作。

1 个答案:

答案 0 :(得分:1)

SIGQUIT以终端的整个前台进程组为目标-它杀死了父级和子级。 为了防止它杀死父母,您需要执行以下任一操作:

  1. 忽略它或将其阻止在父项中
  2. 在父级中捕获它

使用方法1,您需要在执行前在子级中取消阻止/忽略它。 使用方法2时,信号处置将在执行时自动默认为默认值,因此不会影响子进程,但是,拥有至少一个信号处理程序将打开您的应用程序,以防止长时间阻塞的系统调用(如{ {1}},因此您需要考虑这一点。

这是方法2的示例。您可以在wait等上试用。

./a.out sleep 10 #press Ctrl+\ shortly after this