2012-12-14 68 views
0

http://codepad.org/rHIKj7Cd處理(而不是整個代碼)C信號與計時器

我試圖完成,是寫在共享內存大一些的父母,那麼孩子做出相應的反應,而寫東西回來,每五秒鐘一次。我想過使用SIGUSR1-2,也許在處理程序中切換Signum,但我不知道如何編寫它,因爲setitimer會引發SIGALRM。我顯然不想分叉處理程序,因爲我只需要一個孩子和一個父母,那麼我如何定義不同的行爲?我希望我的目標很明確:

每5秒:

  • SIGALRM由定時器
  • 家長寫入其計算到共享內存(正在使用的信號燈)
  • 兒童從共享讀取拋出記憶,寫回它的計算

我也知道信號()沒有勸使用,這不是重點。

+0

你可以使用類似[semaphores](http://linux.die.net/man/7/sem_overview)來同步兩個進程。 –

+0

我正在那樣做,我很困惑的是在哪裏把父母和孩子的工作。因爲當我把它放在現在的位置時,它只運行一次,如果我把它放在處理函數中,會有更多不必要的過程。 – Innkeeper

回答

1

定時器信號處理程序應該儘可能少地執行,可能只有父進程等待的信號量的「後」操作。父進程然後工作,並反過來在孩子等待的信號量上使用「post」。孩子做了自己的工作,並通過另一個「職位」發回父母,然後返回等待信號量,父母可以對孩子的結果做些什麼。最後父進程返回等待來自定時器信號處理程序的信號量。

當然,進程之間以及從定時器信號處理程序到父進程之間的信號並不一定是信號量。還有其他一些方法可以在POSIX系統中的進程之間進行通信和發送「信號」,包括從管道讀取/寫入,在共享內存中設置特殊位或字節或消息隊列。

+0

謝謝你,我正在思考這個問題,雖然因爲我在處理流程,信號量,共享內存方面相當陌生,所以我認爲我不能完全解釋你的答案。 – Innkeeper