2017-11-04 179 views
1

這裏我想在睡覺時向家長髮送SIGINT信號。我已經通過編寫程序來嘗試它。在這個程序中,我不明白爲什麼來自父項的SIGINT信號處理程序根本沒有執行? 這裏是代碼:將信號從孩子發送給父母

#include<stdio.h> 
#include<signal.h> 
#include<unistd.h> 
#include<stdlib.h> 
void sig_usr(int signo){ 
    if(signo == SIGINT) 
    printf("Signal caught!"); 
    return; 
} 

int main(void){ 
    pid_t pid, ppid; 
    ppid = getpid(); 
    printf("ppid = %d\n", ppid); 
    if((pid = fork()) == 0){ 
     printf("killing parent...\n"); 
     kill(ppid, SIGINT); 
     printf("After killing parent...\n"); 
    } 
    else{ 
     sleep(5); 
     printf("%d %d ",ppid, pid); 
     if(signal(SIGINT,sig_usr) == SIG_ERR) 
      printf("Signal processed "); 
    } 
    return 0; 
} 

輸出: 輸出僅打印這麼多的內容。我認爲父母根本沒有執行任何事情。

The output is printing only this much content. I think parent is not executing at all.

回答

2

您需要設置信號處理程序之前SIGINT被髮送到父進程,否則,該處理程序將不會被執行。另外,父進程在執行任何事情之前被殺死。解決這個問題的簡單方法是在父進程的代碼之後移動睡眠調用,並向子進程添加延遲。

#include<stdio.h> 
#include<signal.h> 
#include<unistd.h> 
#include<stdlib.h> 
void sig_usr(int signo){ 
    if(signo == SIGINT) 
    printf("Signal caught!"); 
    return; 
} 

int main(void){ 
    pid_t pid, ppid; 
    ppid = getpid(); 
    printf("ppid = %d\n", ppid); 
    if((pid = fork()) == 0){ 
     sleep(1); // Wait for parent to finish setting up 
     printf("killing parent...\n"); 
     kill(ppid, SIGINT); 
     printf("After killing parent...\n"); 
    } 
    else{ 
     printf("%d %d ",ppid, pid); 
     if(signal(SIGINT,sig_usr) == SIG_ERR) 
      printf("Signal processed "); 
     sleep(5); // Wait to be killed 
    } 
    return 0; 
} 
+0

謝謝@ ID0 – Vijesh

2

當您發送SIGINT signal尚未調用。

我想你想發送SIGINT之前設置信號處理程序:

#include<stdio.h> 
#include<signal.h> 
#include<unistd.h> 
#include<stdlib.h> 
void sig_usr(int signo){ 
    if(signo == SIGINT) 
    printf("Signal caught!"); 
    return; 
} 

int main(void){ 
    pid_t pid, ppid; 
    ppid = getpid(); 
    printf("ppid = %d\n", ppid); 
    if((pid = fork()) == 0){ 
     sleep(1); 
     printf("killing parent...\n"); 
     kill(ppid, SIGINT); 
     printf("After killing parent...\n"); 
    } 
    else{ 
     printf("%d %d ",ppid, pid); 
     if(signal(SIGINT,sig_usr) == SIG_ERR) 
      printf("Signal processed "); 
     sleep(5); 
    } 
    return 0; 
}