簡體   English   中英

如何使信號處理程序僅運行一次並終止所有進程?

[英]How to make signal handler only run it once and terminate all processes?

我有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阻止子進程中的信號

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM