2013-12-14 79 views
0
int main() { 
    int pid = fork(); 
    if(pid > 0){ 
     kill(pid, SIGKILL); 
     printf("a"); 
    }else{ 
     /* getppid() returns the pid 
     of the parent process */ 
     kill(getppid(), SIGKILL); 
     printf("b"); 
    } 
} 

的代碼片段可以有一個結果:沒事,A,B,AB,BA使用叉子和殺死信號

我不明白,爲什麼沒有,AB和BA是可能的。

int a = 1; 
void handler(int sig){ 
    a = 0; 
} 
void emptyhandler(int sig){ 
} 
int main() { 
    signal(SIGINT, handler); 
    signal(SIGCONT, emptyhandler); 

    int pid = fork(); 
    if(pid == 0){ 
     while(a == 1) 
      pause(); 
     printf("a"); 
    }else{ 
     kill(pid, SIGCONT); 
     printf("b"); 
     kill(pid, SIGINT); 
     printf("c"); 
    } 
} 

這一結果是bac,bca。

林不知道爲什麼「一個進程不終止」也有效?爲什麼SIGINT會殺死它?

回答

2

有沒有告訴哪個孩子/父母先得到運行。或者,如果您有多個內核,它們可以並行運行,或者操作系統可能會在任何執行時刻中斷它們,並運行其他子進程或父進程(或某些其他進程)。 kill()也是異步的,它發送信號,在kill()返回後,它可能在稍後被接收器處理。

什麼都沒有:父母在kill(pid, SIGKILL);之後立即死亡。兒童就會被殺死它kill(getppid(), SIGKILL);

之後「一」:孩子獲得前或它kill(getppid(), SIGKILL);後死亡。家長會跑完成。

「b」:父母在kill(pid, SIGKILL);之前或之後被殺死。孩子開始跑步完成。

「ab」父母在打印「a」後(或者它可能設法在孩子信號到達之前運行完成)後立即死亡,孩子在打印「b」後死亡(或者可能設法在父母信號到達之前運行完成)

「ba」與「ab」相同,只是孩子計劃首先打印「b」。

+0

對於我剛剛添加的第二個片段,kill(pid,SIGINT)會做什麼?感謝您的第一部分順便說一句。 –

+0

它將SIGINT信號發送給進程。 SIGINT與按CTRL + C時發送的信號相同。默認情況下,該信號終止該過程。 – nos

+0

在這個作業題目中,「一個過程不會終止」仍然是一種選擇。如果有SIGINT調用,那怎麼可能? –

0

發送信號不構成兩個進程之間的任何種類的同步。只有發送接收信號才能讓您斷定某些事情(例如,打印a)發生在其他事項之後(例如,打印b)。兩個信號都可以「在飛行中」而不被任何人接收。

+0

被稱爲「掛起」。 –

+0

@ Jean-BaptisteYunès:我認爲「懸而未決」是「飛行中」的一個嚴格子集,但缺乏指定的全局同步語義使得難以做到比這更精確。 –

+0

您能解釋一下哪些飛行中的信號未處理? –