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,若資源...