訊號實現父子程序間同步

2021-06-23 06:45:09 字數 1103 閱讀 9368

apue第十章用訊號實現了父子程序間的同步,關鍵點是sigsuspend函式,這裡仔細分析一下實現機制. :

#include 

#include "ourhdr.h" /*

資料型別sig_atomic_t由ansi c定義,在寫時不會被中斷。它意味著這種變數在具有虛存的系統上不會跨越頁邊界,可以用一條機器指令對其訪問。這種型別的變數總是與ansi型別修飾符volatile一併出現,防止編譯器優化帶來的不確定狀態。

*/static volatile sig_atomic_t sigflag;

/* set nonzero by signal handler */

static sigset_t 

newmask, oldmask, zeromask;

static void

sig_usr(int signo) /* one signal handler for sigusr1 and sigusr2 */ /*

父子程序共享正文段,所以,子程序繼承訊號處理函式;

另外,子程序複製父程序資料空間以及堆疊,所以前面的靜態變數在子程序中仍然可以使用.

*/void

tell_wait()

void

tell_parent(pid_t pid) /*

sigsuspend相當於sigprocmask + pause,但是它保證這兩個操作是原子的,也就是說,在兩者之間不會有訊號過來.這就保證了訊號肯定會被pause截住.這一點是非常重要的,因為如果在pause之前收到訊號,訊號處理函式被呼叫,此後如果不再有訊號過來,pause將永遠阻塞.

*/void

wait_parent(void)

void

tell_child(pid_t pid) /*

wait_child與wait_parent完全一樣

*/void

wait_child(void)

測試**:

#include 

#include "ourhdr.h"

intmain(void)

else

exit(0);

}這樣,無論程序如何排程,子程序都將在父程序之後列印資訊,達到同步效果.

訊號實現父子程序間的同步

include include 資料型別sig atomic t由ansi c定義,在寫時不會被中斷。它意味著這種變數在具有虛存的系統上不會跨越頁邊界,可以用一條機器指令對其訪問。這種型別的變數總是與ansi型別修飾符volatile一併出現,防止編譯器優化帶來的不確定狀態。static volat...

父子程序間訊號通訊

司機售票員問題 建立子程序代表售票員,父程序代表司機,同步過程如下 售票員捕捉sigint 代表開車 發sigusr1給司機,司機列印 let s gogogo 售票員捕捉sigiquit 代表停車 發sigusr2給司機,司機列印 stop the bus 司機捕捉sigtstp 代表車到站 發s...

程序間同步之訊號量

概念 訊號量是乙個特殊的變數,程式對其訪問都是原子操作,且只允許對它進行等待 即p 訊號變數 和傳送 即v 訊號變數 資訊操作。最簡單的訊號量是只能取0和1的變數,這也是訊號量最常見的一種形式,叫做二進位制訊號量。而可以取多個正整數的訊號量被稱為通用訊號量。二值訊號量 訊號量的值只有0和 1,若資源...