2012-09-30 127 views
3

我有這個由9個進程組成的多進程程序。一個是產生3個信號產生過程和4個信號處理過程的主要過程。一個是監測過程。現在我已經使用了兩個信號SIGUSR1和SIGUSR2。每個處理程序都可以處理SIGUSR1或SIGUSR2。每當它們收到一個信號時,它們將共享存儲器中SIGUSR1和SIGUSR2信號的計數增加1.由於信號被髮送到進程組,所以監視進程也接收到這些信號。它可以處理這兩個信號,並將其本地信號計數增加1.每當它達到10時,它就會在共享內存中輸出SIGUSR1和SIGUSR2的計數值。多進程信號處理程序中的奇怪結果

我在主程序中有這個選項,它可以運行30秒並終止程序,在這種情況下,我會睡眠(30),然後終止程序。在第二種情況下,它忙於在while循環中等待,計算共享內存中SIGUSR1和SIGUSR2的總數。當它達到100000時,它終止程序。

這裏是我的兩個版本

對於100000第二版本

對於100000信號版本輸出

Initializing the shared memory 
    End of initializing the shared memory 
    Registering the signal handlers 
    End of registering the signal handlers 
    Registering the monitoring process 
    Monitor's pid is 6635 
    End of registering the monitoring process 
    Registering the signal generators 
    Interval SIGUSR1 = 5.79953e-05 
    Interval SIGUSR2 = 8.69632e-05 
    Count SIGUSR1 = 10 
    Count SIGUSR2 = 10 
    Count SSIGUSR1 = 5 
    Count SSIGUSR2 = 5 

    Interval SIGUSR1 = 7.64132e-05 
    Interval SIGUSR2 = 5.72999e-05 
    Count SIGUSR1 = 16 
    Count SIGUSR2 = 24 
    Count SSIGUSR1 = 8 
    Count SSIGUSR2 = 12 

對於30秒的版本

初始化共享輸出內存

End of initializing the shared memory 
    Registering the signal handlers 
    End of registering the signal handlers 
    Registering the monitoring process 
    Monitor's pid is 6719 
    End of registering the monitoring process 
    Registering the signal generators 
    Inside option 1 
    Interval SIGUSR1 = 0.000246763 
    Interval SIGUSR2 = 0.000222743 
    Count SIGUSR1 = 93 
    Count SIGUSR2 = 222 
    Count SSIGUSR1 = 92 
    Count SSIGUSR2 = 111 

    Interval SIGUSR1 = 0.000664711 
    Interval SIGUSR2 = 0.000390577 
    Count SIGUSR1 = 102 
    Count SIGUSR2 = 234 
    Count SSIGUSR1 = 97 
    Count SSIGUSR2 = 117 

爲什麼結果如此滯後於第二種情況。我的意思是當顯示器首次打印輸出時,由處理線程記錄的SIGUSR1和SIGUSR2的計數已經達到了93和222.此外,信號被髮送到進程組。所以每個信號都由兩個處理器和一個監視器處理。在處理程序中只有兩個,因爲四個hander中有兩個處理SIGUSR1,忽略另一個信號,反之亦然。

所以你可以看到什麼錯誤,當我睡覺(30),看到結果。任何見解。我一直試圖調試這幾天但尚未成功。

回答

0

信號可能會在收到時合併(信號用作硬件中斷控制器)。示例:

過程2將信號SIGUSR1發送給當前未激活的過程10。

內核存儲過程10具有未決SIGUSR1

方法3發送信號SIGUSR1到過程10,這是當前不活動。

內核存儲過程10具有未決SIGUSR1(它已經有)

進程10被定於,它看到SIGUSR1掛起,清除未決並啓動信號處理

結果,過程10僅看到一個SIGUSR1。

當您現在用信號添加該洪水系統時,信號排程的順序可能會導致一些信號出現比其他信號更頻繁。

結論: 信號不是作爲通信路徑,而是推動進程。爲了溝通,您使用信號量,管道,文件等,以及喚醒/告訴其他進程他們應該檢查更改的信號。