日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

使用 UNIX System V IPC 機(jī)制共享應(yīng)用程序數(shù)據(jù)( 四 )


清單 5. 使用信號(hào)量來保護(hù)關(guān)鍵部分
#include
#include
#include
#include/* For strerror(3c) */
#include /* For errno */
#include /* rand(3c) */
#include
int main (int argc, char **argv) {
key_t ipckey;
int semid;
struct sembuf sem[2]; /* sembuf defined in sys/sem.h */
/* Generate the ipc key */
ipckey = ftok("/tmp/foo", 42);
/* Set up the semaphore set. 4 == READ, 2 == ALTER */
semid = semget(ipckey, 1, 0666 | IPC_CREAT);
if (semid < 0) {
printf("Error - %sn", strerror(errno));
_exit(1);
}
/* These never change so leave them outside the loop */
sem[0].sem_num = 0;
sem[1].sem_num = 0;
sem[0].sem_flg = SEM_UNDO; /* Release semaphore on exit */
sem[1].sem_flg = SEM_UNDO; /* Release semaphore on exit */
while(1) { /* loop forever */
printf("[%s] Waiting for the semaphore to be releasedn", argv[1]);
/* Set up two semaphore operations */
sem[0].sem_op = 0; /* Wait for zero */
sem[1].sem_op = 1; /* Add 1 to lock it*/
semop(semid, sem, 2);
printf("[%s] I have the semaphoren", argv[1]);
sleep(rand() % 3); /* Critical section, sleep for 0-2 seconds */
sem[0].sem_op = -1; /* Decrement to unlock */
semop(semid, sem, 1);
printf("[%s] Released semaphoren", argv[1]);
sleep(rand() % 3); /* Sleep 0-2 seconds */
}
}
清單 5 的開頭與消息隊(duì)列示例的開頭相同 。其中 msgget 在第二個(gè)參數(shù)中指定消息隊(duì)列的大小,semget 指定信號(hào)量集(Semaphore Set) 的大小 。信號(hào)量集是一組共享一個(gè)公共 IPC 實(shí)例的信號(hào)量 。該集合中的信號(hào)量數(shù)量無法更改 。如果已經(jīng)創(chuàng)建了信號(hào)量集,則 semget 的第二個(gè)參數(shù)實(shí)際上被忽略 。如果 semget 返回一個(gè)指示失敗的負(fù)整數(shù),則打印原因,并退出程序 。
在主 while 循環(huán)之前,對(duì) sem_num 和 sem_flg 進(jìn)行了初始化,因?yàn)樗鼈冊谡麄€(gè)示例中保持一致 。此外還指定了 SEM_UNDO,以便在信號(hào)量擁有者未能釋放該信號(hào)量就已退出的情況下,不會(huì)鎖定所有其他應(yīng)用程序 。
該循環(huán)中還打印了一個(gè)狀態(tài)消息,以指示應(yīng)用程序已開始等待信號(hào)量 。此輸出附帶第一個(gè)命令行參數(shù)作為前綴,以將它與其他實(shí)例區(qū)分開來 。在進(jìn)入關(guān)鍵部分之前,應(yīng)用程序鎖定了信號(hào)量 。此示例中指定了兩個(gè)信號(hào)量指令 。第一個(gè)為 0,意味著應(yīng)用程序?qū)⒌却?,直至信?hào)量值恢復(fù)為 0 。第二個(gè)為 1,意味著在信號(hào)量恢復(fù)為零之后,將向該信號(hào)量加 1 。應(yīng)用程序調(diào)用 semop 以運(yùn)行指令,并向其傳遞信號(hào)量 ID、數(shù)據(jù)結(jié)構(gòu)的地址和要使用的 sembuf 指令數(shù)量 。
在 semop 返回以后,應(yīng)用程序知道它已經(jīng)鎖定了信號(hào)量,并打印一個(gè)消息以指示這一點(diǎn) 。然后關(guān)鍵部分將會(huì)運(yùn)行,在此例中是隨機(jī)地暫停幾秒 。最后,使用 semop 值 -1 來運(yùn)行單個(gè) sembuf 命令,從而釋放信號(hào)量,這實(shí)際上是從信號(hào)量減去 1,并將其值恢復(fù)為 0 。隨后打印更多的調(diào)試輸出,應(yīng)用程序隨機(jī)暫停,然后繼續(xù)執(zhí)行 。清單 6 顯示了此應(yīng)用程序的兩個(gè)實(shí)例的輸出 。
清單 6. 兩個(gè)使用信號(hào)量來保護(hù)關(guān)鍵部分的程序
sunbox$ ./sem_example a & ./sem_example b &
[a] Waiting for the semaphore to be released
[a] I have the semaphore
[b] Waiting for the semaphore to be released
[a] Released semaphore
[b] I have the semaphore
[a] Waiting for the semaphore to be released
[b] Released semaphore
[a] I have the semaphore
[a] Released semaphore
[a] Waiting for the semaphore to be released
[a] I have the semaphore
清單 6 顯示了運(yùn)行的示例的兩個(gè)實(shí)例,這兩個(gè)實(shí)例分別具有名稱 a 和 b 。首先,a 獲得信號(hào)量,在 a 擁有該信號(hào)量的同時(shí),b 嘗試獲得一個(gè)鎖 。一旦釋放了信號(hào)量,b 即獲得鎖 ?,F(xiàn)在情況顛倒過來,變?yōu)榈却?b 完成 。最后,a 在信號(hào)量被釋放后再次獲得該信號(hào)量,因?yàn)?b 沒有等待 。

推薦閱讀