首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当子进程通过ctrl-\中止时,父进程不运行

当子进程通过ctrl-\中止时,父进程不运行
EN

Stack Overflow用户
提问于 2019-05-11 17:22:51
回答 1查看 47关注 0票数 1

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

代码语言:javascript
复制
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命令本身。

如果不取消就行了。但是,当我尝试中止它时(例如,使用一个睡眠命令,然后输入ctrl-4):

代码语言:javascript
复制
./ntimes 2 sleep 10
 ^\Quit (Core dumped)

它会产生一个垃圾场。我希望父进程打印一条消息。我尝试过信号处理功能和许多其他功能,但我似乎无法使它工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-11 17:37:35

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

  1. 忽略它或在父级中阻止它。
  2. 从父母那里抓到它

在使用方法1.时,您需要在执行之前将其解锁/在子节点中对其进行统一处理。使用方法2.,信号处理将在执行时自动默认,因此不会影响子处理程序,但是,至少有一个信号处理程序将打开应用程序,以防止在长阻塞系统(如wait )上出现EINTR错误的可能性,因此您需要对此进行解释。

下面是方法2的一个例子,您可以在例如./a.out sleep 10 #press Ctrl+\ shortly after this上试用它。

代码语言:javascript
复制
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <errno.h>
void h(int Sig){}
int main(int argc, char *argv[])
{
    sigaction(SIGQUIT, &(struct sigaction){.sa_handler=h}, 0);

    int cont, status, times=1;
    pid_t pid;
    for(cont = 0; cont < times; cont++)
    {
        pid = fork();
        if(pid == 0)
            execvp(argv[1],argv+1);
        else if (pid >0) {
            // retry on EINTR
            int rc; do{ rc=wait(&status); }while(0>rc && EINTR==errno);
            if (0>rc) return perror("wait"),1;
            if (WIFSIGNALED(status)){
                if (WCOREDUMP(status))
                    printf("Core dump generado\n");
            }
        }
    }
    return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56092662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档