如果用semget建立了乙個新的訊號量集物件時,則semid_ds結構成員變數的值設定如下:
sem_otime設定為0。
sem_ctime設定為當前時間。
msg_qbytes設成系統的限制值。
sem_nsems設定為nsems引數的數值。
sem***的讀寫許可權寫入sem_perm.mode中。
sem_perm結構的uid和cuid成員被設定成當前程序的有效使用者id,gid和cuid成員被設定成當前程序的有效組id。
2. semop函式原型
sops為指向sembuf陣列,定義所要進行的操作序列。下面是訊號量操作舉例。
struct sembuf sem_get=; /將訊號量物件中序號為0的訊號量減1/
struct sembuf sem_get=; /將訊號量物件中序號為0的訊號量加1/
struct sembuf sem_get=; /程序被阻塞,直到對應的訊號量值為0/
flag一般為0,若flag包含ipc_nowait,則該操作為非阻塞操作。若flag包含sem_undo,則當程序退出的時候會還原該程序的訊號量操作,這個標誌在某些情況下是很有用的,比如某程序做了p操作得到資源,但還沒來得及做v操作時就異常退出了,此時,其他程序就只能都阻塞在p操作上,於是造成了死鎖。若採取sem_undo標誌,就可以避免因為程序異常退出而造成的死鎖。
3. semctl函式原型
**舉例
#include #include #include #include #include #include #include #include union semun;
static int sem_id = 0;
static int set_semvalue();
static void del_semvalue();
static int semaphore_p();
static int semaphore_v();
int main(int argc, char *ar**)
/* 設定要輸出到螢幕中的資訊,即其引數的第乙個字元 */
message = ar**[1][0];
sleep(2);
}for(i = 0; i < 10; ++i)
/* 向螢幕中輸出資料 */
printf("%c", message);
/* 清理緩衝區,然後休眠隨機時間 .
fflush(stdout)重新整理標準輸出緩衝區,把輸出緩衝區裡的東西列印到標準輸出裝置上*/
fflush(stdout);
sleep(rand() % 3);
/* 離開臨界區前再一次向螢幕輸出資料 */
printf("%c", message);
fflush(stdout);
/* 離開臨界區,休眠隨機時間後繼續迴圈 */
if(!semaphore_v())
sleep(rand() % 2);
}sleep(10);
printf("\n%d - finished\n", getpid());
if(argc > 1)
exit(exit_success); }
static int set_semvalue()
return 1;}
static void del_semvalue()
}static int semaphore_p()
return 1;}
static int semaphore_v()
return 1;
}
linux 訊號量(程序間通訊)
將使用乙個程式來演示訊號量的使用,程式用pv操作控制訊號量,以操作臨界區,p操作讓訊號量減1,v操作讓訊號量加1,而pv操作之間的 即為臨界區關鍵 每次只能由乙個程序訪問。程式建立出乙個子程序,在兩個程序中分別有一段臨界區關鍵 實現的功能都是不斷的順序輸出0 9的字元。保證程序間同步 plain v...
linux 程序間通訊 訊號量
例項中首先使用fork 建立乙個子程序,在父程序呼叫kill 之前,在子程序中使用raise 向自身傳送sigstop訊號,是子程序暫停。接下來使用kill 向子程序傳送訊號 ngnsvr9 none home xionghailong example cat kill raise.c includ...
Linux 程序間通訊 訊號量
linux學習目錄 1 什麼是訊號量?在對於臨界區資源管理過程中,為了防止多個程式同時訪問乙個共享資源而引發的一系列問題。比如 死鎖。為了解決這種問題,巨人們就發明了訊號量。訊號量就是為了解決在乙個臨界區只有乙個程序訪問它,也就是說訊號量相當於交警,來協調程序對共享資源有序的訪問而不造成死鎖等行為。...