【问题标题】:How to make signal handler only run it once and terminate all processes?如何使信号处理程序只运行一次并终止所有进程?
【发布时间】:2018-10-19 10:46:01
【问题描述】:

我有 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 程序多次调用信号处理程序并打印信息时,尝试多次取消链接文件。

如何解决这个问题?

【问题讨论】:

  • 为什么不安排主进程在收到信号时做任何事情呢?
  • 请注意,sem_unlink()shm_unlink()exit()printf() 都不是异步信号安全函数,不能从信号处理程序中安全调用。根据 POSIX 标准的2.4 Signal Concepts:“任何不在上表中的函数都可能对信号不安全。......当信号中断不安全函数或等效函数......并且信号捕获函数调用不安全函数时,行为未定义。”

标签: c signals fork posix signal-handling


【解决方案1】:

当您分叉一个新进程时,新分叉的子进程将继承父进程的信号处理程序。因此,在您的情况下,父进程和子进程都将具有相同的信号处理程序,并且当收到信号时,它们都会运行。

要解决此问题,您可以在 fork 之后仅在父进程中注册信号处理程序,也可以使用 sigprocmask 阻止子进程中的信号

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多