Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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
C SIGINT被多个进程忽略_C_Linux_Signals_Fork_Signal Handling - Fatal编程技术网

C SIGINT被多个进程忽略

C SIGINT被多个进程忽略,c,linux,signals,fork,signal-handling,C,Linux,Signals,Fork,Signal Handling,我想创建三个进程,在按下ctrl+c之前打印一些内容。下面您可以看到我的尝试,但当尝试停止程序时,什么也没有发生。当唯一的一个孩子被叉起来时,效果很好。哪里会有问题?提前谢谢 void my_handler(int s){ printf("Caught signal %d, I am dying\n",s); exit(1); } void doChild(int count){ fprintf(stdout,"Chil

我想创建三个进程,在按下ctrl+c之前打印一些内容。下面您可以看到我的尝试,但当尝试停止程序时,什么也没有发生。当唯一的一个孩子被叉起来时,效果很好。哪里会有问题?提前谢谢

     void my_handler(int s){
          printf("Caught signal %d, I am dying\n",s);
       exit(1);
     }

     void doChild(int count){
     fprintf(stdout,"Child %d with pid: %d\n",count, getpid());
    }


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

     int count = 0;
     pid_t pid;
     struct sigaction sigIntHandler;
     sigIntHandler.sa_handler = my_handler;
     sigemptyset(&sigIntHandler.sa_mask);
     sigIntHandler.sa_flags = 0;
     sigaction(SIGINT, &sigIntHandler, NULL);
     fprintf(stdout, "Ahoj svjete!\n");

     for(;count < 3;count++){
            pid = fork();
    switch(pid){
             case -1:
                    perror("Fork :(");
                     exit(EXIT_FAILURE);

             case 0:
                     while(1){
                            doChild(count);
                    }
       }
    }

     exit(EXIT_SUCCESS);
    }
void my_处理程序(int s){
printf(“捕捉到信号%d,我要死了\n”,s);
出口(1);
}
void doChild(整数计数){
fprintf(stdout,“带pid的子%d:%d\n”,count,getpid());
}
int main(int argc,字符**argv){
整数计数=0;
pid_t pid;
结构sigaction sigIntHandler;
sigIntHandler.sa_handler=my_handler;
SIGEptySet(&sigIntHandler.sa_mask);
sigIntHandler.sa_标志=0;
sigaction(SIGINT,&sigintmhandler,NULL);
fprintf(标准“Ahoj svjete!\n”);
对于(;计数<3;计数++){
pid=fork();
开关(pid){
案例1:
佩罗尔(“福克:(”);
退出(退出失败);
案例0:
而(1){
多奇尔德(伯爵);
}
}
}
退出(退出成功);
}
在此循环中:

for(;count < 3;count++){
    pid = fork();
}

正如REACHUS所指出的,您得到的是8个进程,而不是3个。此外,该开关测试每个进程中最后一个fork calll的结果,因此其中4个进程立即退出,而其他4个仍在
doChild
循环中运行


现在,由于顶级进程(执行第一个fork的初始进程)是退出的进程之一(其
fork
调用全部返回子进程的PID,从不为0),因此shell将再次接管,这意味着当您点击ctrl-C时,它将进入shell,而不是进入分叉的子进程。这些子进程永远看不到SIGINT(除非使用
kill
)显式发送给他们,否则不要退出。

main()、'argc'和'argv'的参数未使用。编译器将为每个未使用的参数发出警告。建议1)在启用所有警告的情况下编译,修复这些警告。对于上述警告对,建议使用'int main(void)';检查来自“fork()的返回值'仅在最后一次调用fork时检查,而不是在以前的调用中检查。建议将pid值的检查移到“for”循环内部。正如您在发布的代码中所看到的,使用制表符进行缩进是一个非常糟糕的主意。为了我们人类读者的利益,一致建议缩进。建议在每个大括号后缩进4个空格'{'在每个右括号前取消缩进'}'首先,它只是代码的一部分…我将编写一些getopt和东西:)其次,你是对的,我没有意识到。我解决了进程数量的问题…但信号处理仍然不起作用。
void my_handler(int s){
    printf("Caught signal %d, I am dying, my PID=%d\n",s, (int)getpid());
    exit(1);
}

void doChild(int count){
    fprintf(stdout,"Child %d with pid: %d\n",count, getpid());
}

int main(int argc, char **argv){
    int count = 0;
    int status;
    pid_t pid;

    for(;count < 2;count++){
        pid = fork();
    }

    printf("My PID=%d\n", (int)getpid());
    fprintf(stdout, "Ahoj svjete!\n");

    switch(pid){
        case -1:
            perror("Fork :(");
            exit(EXIT_FAILURE);
        case 0:
            signal(SIGINT, my_handler);
            while(1){
                doChild(count);
            }
        default:
            printf("Parent\n");
            sigignore(SIGINT);
            wait(&status);
    }

    printf("Process %d ended life.\n", (int)getpid());
    exit(EXIT_SUCCESS);
}