2013-08-05 130 views
0

我正在爲考試做一些練習題,其中一個問題提供了兩段代碼,分別爲parent.c和child.c。父母創建一個孩子並在其上觸發信號,孩子每次收到信號都會顯示一條消息。孩子將花費其餘的時間從main打印消息。問題是描述child.c中的信號處理有什麼問題,並重新編寫代碼來糾正它。我瞭解了信號的一般概念,但實施它們有很多困難。我不確定在child.c中procmask是否正常工作,我對信號不太滿意,但我不明白爲什麼你會把NULL作爲最後一個參數,所以也許這就是爲什麼它錯了?有人可以請我指出正確的方向,並讓我知道哪部分代碼是錯誤的,爲什麼。父進程在子進程中觸發信號,但孩子的信號處理需要改進

Parent.c

#include <unistd.h> 
#include <signal.h> 
int 
main(int argc, char *argv[]) 
{ 
    pid_t pid; 
    sigset_t set; 

    sigemptyset(&set); 

    sigaddset(&set, SIGUSR1); 

    sigprocmask(SIG_BLOCK, &set, NULL); 

    pid = fork(); 

    if (pid == 0) { 
     execlp("./child", "./child", NULL); 
    } 

    while (1) { 
     kill(pid, SIGUSR1); 
    } 

    return (0); 
} 

Child.c

#define _XOPEN_SOURCE 500 

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <unistd.h> 

static void 
handler(int signo) 
{ 
    printf("This is the SIGUSR1 signal handler!\n"); 
} 

int 
main(void) 
{ 
    sigset_t set; 

    sigemptyset(&set); 

    sigset(SIGUSR1, handler); 

    sigprocmask(SIG_SETMASK, &set, NULL); 

    while (1) { 
     printf("This is main()!\n"); 
    } 

    return (0); 
} 
+0

*孩子的'sigprocmask'有*錯誤。再說一遍就會把整件事情都帶走。你能解釋一下兒童流程在那裏想要做什麼嗎?如果你明白這一點,那麼明白爲什麼它錯了不應該很難。 –

回答

0
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 

的最後一個參數是用來存儲舊信號掩碼。當它是NULL,這意味着我們不需要存儲舊的信號掩碼。

注意,你不應該在信號處理函數使用printf,因爲它不是折返,見How to avoid using printf in a signal handler?

execlp的用法是錯誤的,因爲NULL可以被定義爲0,編譯器可能會認爲這是一個整數,而不是一個空指針。

execlp("./child", "./child", NULL); 

最後一個參數應該是(char *)0,像這樣:

execlp("./child", (char *)0); 
+0

感謝您的評論!特別是對於解釋sigprocmask參數。這個問題只是希望我們改變Child.c而不是Parent.c,所以我不認爲講師正在尋找的是修復execlp行。 – user1786327

0

由於man sigset狀態sigset是過時的,你應該使用sigactionHere是如何使用它的例子。

相關問題