2016-11-09 82 views
0

嗨,我想在這裏做的是一個程序,首先註冊它的文件server.lock中的pid,然後它應該做一個fork()。兒子應該說它開始工作,而不是被動地等待並且發出信號SIGUSR2,並且當它收到它時,它應該終止它的執行並且寫下「再見殘酷的世界」。父母應該開始寫它並做一個被動等待,然後武裝信號SIGUSR1和SIGINT。如果它收到SIGUSR1,它自己應該發送信號SIGUSR2給子,如果它接收到信號SIGINT(如果它是第一次收到它),它應該說它獲得了信號,如果它是第二次它應該發送信號SIGUSR2到兒子就這樣終止了兒子的生命,這是執行。現在我的問題是與父母,我不知道爲什麼,但第二次它收到信號它說錯誤「用戶定義的信號2」,並離開,如果有人可以向我解釋我在做什麼錯在這裏,我會非常感謝。這是代碼。謝謝。使用fork()和信號處理程序c

int p = 1; 
int son; 

void handle_SIGINT(int signal){ 
    if (p==1) { 
    p = 2; 
    printf("The authentication module received the signal SIGINT\n"); 
    }else{ 
    kill(son, SIGUSR2); 
    exit(0); 
    } 
} 

void handle_SIGUSR1(int signal){ 
    kill(son, SIGUSR2); 
} 

void handle_SIGUSR2(int signal){ 
    printf("Goodbye cruel world\n"); 
    exit(0); 
} 

void main(){ 


    int pid = getpid(); 
    FILE *f = fopen("server.lock", "w"); 
    fprintf(f, "%d", pid); 
    fclose(f); 

int n = fork(); 

    if (n==0) { 
     printf("The message handling module has started\n"); 
     signal(SIGUSR2, handle_SIGUSR2); 
     while(1) 
       pause(); 
    }else{ 
     printf("The authentication module has started\n"); 

     son = getpid(); 

     signal(SIGUSR1, handle_SIGUSR1); 

     signal(SIGINT, handle_SIGINT); 

     while(1) 
      pause(); 
    } 
} 
+0

IIRC信號處理程序在調用時未被設置,這意味着它需要重新設置它自己。 – immibis

+0

對不起,但不是所有3個信號處理程序都應該在主程序之前定義?我的意思是第一次(對於信號情報)父母完美地工作,問題是第二次。 – GamerGirl

+0

可能重複的[sigaction和信號有什麼區別?](http://stackoverflow.com/questions/231912/what-is-the-difference-between-sigaction-and-signal) –

回答

0

你的命名讓我困惑。看起來你的問題是你的名字爲son的變量。這不是兒子又名兒童過程。那是父母。

fork調用返回兩次。一旦進入父母,一旦進入孩子。在父母中,它返回孩子的PID。它在小孩中返回0。你讓他們倒過來!您正在使用signal而不是sigaction。我建議使用sigaction。它要複雜得多,但也提供了更多的選擇。

您遇到的問題是signal是在處理程序被調用後,它將信號重置爲默認行爲。但是這也不能保證。 GNU C庫的行爲有所不同,具體取決於是否定義了_BSD_SOURCE,_GNU_SOURCE或什麼也沒有定義。這是爲了模擬它在BSD UNIX或SYSV UNIX上的表現。這就是爲什麼sigaction是更好的選擇,它在每個POSIX系統上都具有相同的功能。

+0

對不起,但沒有調用父親的getpid()方法返回兒子的pid,並在兒子上調用它返回0?這就是爲什麼我在main的else調用了getpid()(對不起,如果這是一個愚蠢的問題) – GamerGirl

+0

@ j.DOH:很容易看到你自己。打印出'pid'和'son'的值。 –

+0

@ Zan Lynx好的非常感謝你的幫助,我真的很感激。 – GamerGirl