2014-10-04 46 views
0

我正在創建一個相對簡單的多進程程序,以瞭解使用C的Linux中的信號和信號處理。我有幾個進程處理髮送到所有進程的信號(我使用sigaction來分配處理程序)過程組和一個跟蹤過程,該過程在檢測到一定數量的信號之後顯示一些信息。信號處理輸出顯示問題

我的問題是這樣的。如何可靠地顯示跟蹤過程中的控制檯輸出?此過程需要顯示檢測到的當前信號數量,並且我知道printf()不適合從信號處理程序調用。我知道我可以使用write(),但是我不確定我可以將變量值放到這裏來顯示,我認爲這個系統調用可以被信號中斷。

你能給我一個簡單的例子,有3個過程(一個產生信號(父),1個處理信號(孩子1)和一個關於信號的報告信息(孩子2)),或者解釋記者如何處理應該使用全局共享變量的值處理輸出?

感謝

回答

1

關於什麼可以在信號處理程序來完成一些信息,請參閱How to avoid using printf() in a signal handler?

我不能給你一個「簡單」的例子,因爲你提出的方案非常複雜 - 第三個過程是怎麼知道第一個過程發送給第二個過程的信號?信號非常粗糙;除了'發送信號'外,只有很少的信息可用(如果在調用sigaction()函數時使用struct sigactionSA_SIGINFO標誌中的sa_sigaction成員,則稍微多一點)。對於大多數實際目的而言,你所要求的是無法完成的。

如果你要接近你的場景,那麼也許該方法是在父母中設置一個共享內存段,兩個孩子都可以訪問它。第二個孩子(信號接收器)可以在收到信號時將信息複製到共享存儲器中,而第三個孩子將信息從共享存儲器中複製並寫入。您需要查看信號處理函數可以使用哪些協調函數(如果有的話) - x-ref'd問題的答案涵蓋了這一點(答案看起來像'沒有',或者只有粗略的答案如open()mkdir())。奇怪的是,POSIX標準沒有列出諸如strcpy()memcpy()之類的功能作爲信號安全。關於'如何可靠地顯示控制檯輸出',等待信號到達時你的過程將做什麼?您可以安排信號處理程序設置一個標誌,並且循環代碼可以安排檢查標誌,格式化和寫入數據(甚至包括標準I/O;這不再在信號處理程序中),然後執行回到等待下一個信號到達。

+0

感謝有關printf()的信息。 我知道你對一個流程的看法,知道他人在做什麼。我使用mmap()引入了全局共享變量,它引入了併發問題,我可以使用自旋鎖,sem,mutext等來處理這些問題......我只需要向所有進程發送信號,並讓它們記錄接收它,記者進程接收到相同的信號,並在計算了一些信號後顯示全局共享數據。 – OwlsCIS 2014-10-05 00:26:38