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

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


清單 2 顯示了消息隊(duì)列的消息提交部分 。
清單 2. 向消息隊(duì)列提交消息的程序
#include
#include
#include
#include
#include
int main (void) {
key_t ipckey;
int mq_id;
struct { long type; char text[100]; } mymsg;
/* Generate the ipc key */
ipckey = ftok("/tmp/foo", 42);
printf("My key is %dn", ipckey);
/* Set up the message queue */
mq_id = msgget(ipckey, IPC_CREAT | 0666);
printf("Message identifIEr is %dn", mq_id);
/* Send a message */
memset(mymsg.text, 0, 100); /* Clear out the space */
strcpy(mymsg.text, "Hello, world!");
mymsg.type = 1;
msgsnd(mq_id, &mymsg, sizeof(mymsg), 0);
}
清單 2 中的代碼包括了必要的頭文件,然后定義了將在 main 函數(shù)中使用的變量 。第一要?jiǎng)?wù)是使用 /tmp/foo 作為命令文件和使用數(shù)字 42 作為 ID 來確定 IPC 密鑰 。出于演示的目的,這里使用 printf(3c) 將密鑰顯示在屏幕上 。接下來,該代碼使用 msgget 創(chuàng)建消息隊(duì)列 。msgget 的第一個(gè)參數(shù)是 IPC 密鑰,第二個(gè)參數(shù)是一組標(biāo)志 。在該示例中,標(biāo)志包括八進(jìn)制權(quán)限(該權(quán)限允許具有 IPC 密鑰的任何人完全使用該 IPC)和 IPC_CREAT 標(biāo)志(此標(biāo)志導(dǎo)致 msgget 創(chuàng)建隊(duì)列) 。同樣,結(jié)果被打印到屏幕上 。
將消息發(fā)送到隊(duì)列是非常簡單的 。在對(duì)消息中的內(nèi)存空間清零之后,將一個(gè)熟悉的字符串復(fù)制到緩沖區(qū)的文本部分 。將消息類型設(shè)置為 1,然后調(diào)用 msgsnd 。msgsnd 預(yù)期接受的參數(shù)為隊(duì)列 ID、一個(gè)指向數(shù)據(jù)的指針和數(shù)據(jù)的大小,以及一個(gè)指示是否阻塞該調(diào)用的標(biāo)志 。如果該標(biāo)志為 IPC_NOWAIT,則即使隊(duì)列已滿,該調(diào)用也會(huì)返回 。如果該標(biāo)志為 0,則調(diào)用將阻塞,直至隊(duì)列上的空間被釋放、隊(duì)列被刪除或應(yīng)用程序收到某個(gè)信號(hào) 。
該過程的客戶端行為與此類似 。清單 3 顯示了檢索服務(wù)器發(fā)送的消息的代碼 。
清單 3. 用于從隊(duì)列檢索消息的代碼
#include
#include
#include
#include
#include
int main (void) {
key_t ipckey;
int mq_id;
struct { long type; char text[100]; } mymsg;
int received;
/* Generate the ipc key */
ipckey = ftok("/tmp/foo", 42);
printf("My key is %dn", ipckey);
/* Set up the message queue */
mq_id = msgget(ipckey, 0);
printf("Message identifIEr is %dn", mq_id);
received = msgrcv(mq_id, &mymsg, sizeof(mymsg), 0, 0);
printf("%s (%d)n", mymsg.text, received);
}
獲得 IPC 密鑰和消息隊(duì)列標(biāo)識(shí)符的過程與服務(wù)器的代碼類似 。對(duì) msgget 的調(diào)用不指定任何標(biāo)志,因?yàn)榉?wù)器已經(jīng)創(chuàng)建了隊(duì)列 。如果應(yīng)用程序的設(shè)計(jì)允許客戶端在服務(wù)器之前啟動(dòng),則客戶端和服務(wù)器都必須指定權(quán)限和 IPC_CREAT 標(biāo)志,以便其中首先啟動(dòng)的應(yīng)用程序創(chuàng)建隊(duì)列 。
然后 mq_clIEnt.c 調(diào)用 msgrcv 以從隊(duì)列提取消息 。前三個(gè)參數(shù)指定消息隊(duì)列標(biāo)識(shí)符、指向?qū)⒌膬?nèi)存空間的指針和緩沖區(qū)的大小 。第四個(gè)參數(shù)是類型參數(shù),它允許您選擇所要獲得的消息:
如果類型為 0,則返回隊(duì)列中的第一個(gè)消息 。
如果類型為正整數(shù),則返回隊(duì)列中的第一個(gè)該類型的消息 。
如果類型為負(fù)整數(shù),則返回隊(duì)列中具有最小值的第一個(gè)消息,且該最小值小于或等于指定類型的絕對(duì)值 。例如,如果要將 2 然后再將 1 添加到隊(duì)列,則使用類型 -2 調(diào)用 msgrcv 將返回 1,因?yàn)樗钚?,盡管它是隊(duì)列中的第二個(gè)消息 。
傳遞給 msgrcv 的第五個(gè)參數(shù)同樣是阻塞標(biāo)志 。清單 4 顯示了實(shí)際操作中的客戶端和服務(wù)器 。
清單 4. 客戶端和服務(wù)器代碼的輸出
sunbox$ ./mq_server
My key is 704654099
Message identifier is 2

推薦閱讀