#include
#include
/*資料型別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)
int main(void)
else
return 0;
}
訊號實現父子程序間同步
apue第十章用訊號實現了父子程序間的同步,關鍵點是sigsuspend函式,這裡仔細分析一下實現機制.include include ourhdr.h 資料型別sig atomic t由ansi c定義,在寫時不會被中斷。它意味著這種變數在具有虛存的系統上不會跨越頁邊界,可以用一條機器指令對其訪問...
父子程序間訊號通訊
司機售票員問題 建立子程序代表售票員,父程序代表司機,同步過程如下 售票員捕捉sigint 代表開車 發sigusr1給司機,司機列印 let s gogogo 售票員捕捉sigiquit 代表停車 發sigusr2給司機,司機列印 stop the bus 司機捕捉sigtstp 代表車到站 發s...
程序間同步之訊號量
概念 訊號量是乙個特殊的變數,程式對其訪問都是原子操作,且只允許對它進行等待 即p 訊號變數 和傳送 即v 訊號變數 資訊操作。最簡單的訊號量是只能取0和1的變數,這也是訊號量最常見的一種形式,叫做二進位制訊號量。而可以取多個正整數的訊號量被稱為通用訊號量。二值訊號量 訊號量的值只有0和 1,若資源...