【发布时间】:2015-05-09 20:56:27
【问题描述】:
我想创建三个进程,它们会打印一些东西,直到我按下 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);
}
【问题讨论】:
-
main() 的参数,'argc' 和 'argv' 没有被使用。编译器将为每个未使用的参数发出警告。建议 1) 在启用所有警告的情况下编译,修复这些警告。对于上述一对警告,建议 'int main( void );
-
检查'fork()'返回的值只检查最后一次fork调用,而不是之前的调用。建议将 pid 值的检查移到“for”循环内。
-
使用制表符进行缩进,正如您在发布的代码中看到的那样,是一个非常糟糕的主意。为了我们人类读者,建议一致缩进。建议在每个左大括号 '{' 后缩进 4 个空格,在每个右大括号 '}' 之前不缩进
-
首先,它只是代码的一部分...我要写一些getopt之类的东西:)其次,你说得对,我没有意识到这一点。
标签: c linux signals fork signal-handling