c - 如何使信号处理程序只运行一次并终止所有进程?
问题描述
我有 N 个子进程和一个父进程。我有信号处理程序,它在下面的代码代码中。
void unlink_semaphores(){
sem_unlink(SEM_NAME1) < 0;
// perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME2) < 0;
//perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME3) < 0;
// perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME4) < 0;
// perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME5) < 0;
//perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME6) < 0;
//perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME7) < 0;
//perror("sem_unlink(3) failed");
if (shm_unlink(SHMOBJ_PATH1) != 0) {
// perror("In shm_unlink() of buffer 1");
exit(1);
}
}
void sinyal_handler(int signo)
{
if (signo == SIGINT || signo == SIGTERM) {
if(signo == SIGINT) printf("received Ctrl+C\n");
if(signo == SIGTERM) printf("received SIGTERM \n");
printf("closing semaphores and giving shared maps...\n");
unlink_semaphores();
_exit(EXIT_FAILURE);
}
}
在分叉之前的主程序中,我设置了信号处理程序。
signal(SIGINT,&sinyal_handler);
signal(SIGTERM,&sinyal_handler);
并且子进程永远不会超出 While(1) 循环,直到 CTRL+C 进入程序并且信号处理程序通过关闭链接的信号量等来杀死它。
for (i = 0; i < PROCESS_N; i++) {
if (fork() == 0) {
// do the job specific to the child process
//random shared variable -> ra
while(1){ .. code->
问题是当我按 CTRL + C 程序多次调用信号处理程序并打印信息时,尝试多次取消链接文件。
如何解决这个问题?
解决方案
当您分叉一个新进程时,新分叉的子进程将继承父进程的信号处理程序。因此,在您的情况下,父进程和子进程都将具有相同的信号处理程序,并且当收到信号时,它们都将运行。
要解决此问题,您可以在 fork 之后仅在父进程中注册信号处理程序,或者您可以通过使用阻止子进程中的信号sigprocmask
推荐阅读
- java - 将字符串缩小为子字符串
- sql - 递归标量函数
- javascript - 删除另一个节点时删除元素的属性
- string - 如何在 Swift 5 中将 swift 字符串传递给 c 函数
- php - 如何在paypal sdk php中付款失败
- javascript - Unable to set property of a single element in an array
- amazon-web-services - 如何在 AWS S3 中托管的应用程序中实现单点登录?
- python - 根据不同列中的条件修改 2 列
- php - woocommerce oauth 的 Rest 身份验证
- angular - Angular8 / NG-ZORRO 8:在 nzAction 的 ng-template 中绑定