Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过ctrl键中止子进程时,父进程未运行-\_C - Fatal编程技术网

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

通过ctrl键中止子进程时,父进程未运行-\,c,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 < t

我正在执行这个任务,其中生成了许多子进程,如果它们被中止(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;
}

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

SIGQUIT针对终端的整个前台进程组,它会杀死父进程和子进程。 要防止它杀死父级,您需要:

  • 忽略它或在父级中阻止它
  • 在父母身上抓住它
  • 使用方法1,您需要在执行之前在子级中解除阻止/取消对其的锁定。 在方法2中,信号处理将在执行时自动默认,因此不会影响子级,但是,至少有一个信号处理程序将打开应用程序,在长阻塞系统调用(如
    wait
    )时可能出现EINTR错误,因此您需要对此进行说明

    下面是方法2的一个示例。您可以尝试使用它,例如,
    /a.out sleep 10#在此之后不久按Ctrl+\键

    #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;
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    空h(int-Sig){}
    int main(int argc,char*argv[])
    {
    sigaction(SIGQUIT,&(struct-sigaction){.sa_handler=h},0);
    int cont,状态,时间=1;
    pid_t pid;
    对于(cont=0;cont0){
    //在EINTR上重试
    int rc;do{rc=wait(&status);}while(0>rc&&EINTR==errno);
    如果(0>rc)返回perror(“等待”),则为1;
    if(WIFSIGNALED(状态)){
    如果(WCOREDUMP(状态))
    printf(“核心转储generado\n”);
    }
    }
    }
    返回0;
    }
    
    当您通过终端发送信号时,所有进程都会发出信号。如果您希望父进程在接收到将终止它的信号后继续,则必须设置适当的信号处理-可能是与和朋友一起设置。你说你已经尝试过信号处理函数,但你没有展示代码。我们无法修复你没有展示给我们的东西,是吗?请注意,您应该在
    execvp()
    之后执行某种退出操作,以处理无效(未知)命令,最好还有一条错误消息。表面上看,您的
    execvp()
    行应该是
    execvp(argv[2],&argv[2])
    将命令名和参数向前传递。我编译了上面发布的全部代码,当使用sleep 10作为参数运行它时,然后通过ctr中止它-\stil我得到了“core dumped”消息。它对你有用吗?@Cvg是的。我得到了“核心转储generado”。
    #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;
    }