首页 > 解决方案 > 忽略父 pid 程序上的 Ctr+c

问题描述

我正在尝试制作自己的外壳,并且正在尝试获取 Ctrl+c 以便它关闭子进程,而不是父进程(my_shell)。

这是我的分叉代码:

 jobs_list[0].pid = fork();
                if (jobs_list[0].pid == 0) {
                        // Child process
                        if (execvp(argumentos[0], argumentos) == -1) {
                                perror("lsh");
                        }
                        exit(EXIT_FAILURE);
                } else if (jobs_list[0].pid < 0) {
                        // Error forking
                        perror("lsh");
                } else {
                        while(jobs_list[0].pid  != 0){
                        pause();
                        }
                }

所以我的父母在等待孩子,当我在一个正在跑步的孩子上按 ctrl+c 时,它会正确地杀死它,但我想忽略什么时候只有我父亲在跑步。我的 ctrl+c 信号处理程序是:

void ctrlc(int signum) {
            printf("I am the process with PID %d , and the kid process is  %d \n",pid,jobs_list[0].pid);
            if(jobs_list[0].pid > 0){ //when 0 means there is a child
                    printf("I KILL THE PROCESS %d \n",jobs_list[0].pid);
                    kill(jobs_list[0].pid,SIGINT);
                    signal(SIGINT, ctrlc);

            }else{
                    signal(SIGINT, ctrlc);

            }
    }

当我有一个孩子睡觉并点击 Ctrl+c 时:

gnadal: ~~>sleep 40
Parse_args()--> token 0: sleep
Parse_args()--> token 1: 40

I am the process with PID 7987 , and the kid process is  7988 
I KILL THE PROCESS 7988

但是当我空闲时,我只是退出程序本身。为什么当我在父程序上按 Ctrl+c 时我的 shell 停止?

谢谢你的帮助。

标签: ckillsigint

解决方案


推荐阅读