freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

linux環(huán)境進程間通信(三):消息隊列-全文預覽

2025-01-29 07:54 上一頁面

下一頁面
  

【正文】 send error\n)。 [0]=39。 return。)。 struct msqid_ds msg_ginfo,msg_sinfo。 }msg_sbuf。 int msgid。 四、消息隊列應用實例 消息隊列應用相對較簡單,下面實例基本上覆蓋了對消息隊列的所有操作,同時,程序輸出結(jié)果有助于加深對前面所講的某些規(guī)則及消息隊列限制的理解。在后面的應用實例中,輸出了 redhat ,結(jié)果參見 附錄 3。 該系統(tǒng)調(diào)用對由 msqid 標識的消息隊列執(zhí)行 cmd操作,共有三種 cmd操作: IPC_STAT、 IPC_SET 、 IPC_RMID。 對發(fā)送消息來說,有意義的 msgflg標志為 IPC_NOWAIT,指明在消息隊列沒有足夠空間容納要發(fā)送的消息時, msgsnd是否等待。 =0),調(diào)用將返回消息隊列中的哪個消息。 該系統(tǒng)調(diào)用 從 msgid代表的消息隊列 中讀取一個消息,并把消息存儲在 msgp指向的 msgbuf結(jié)構(gòu)中。 在以下兩種情況下,該調(diào)用 將創(chuàng)建一個新的消息隊列 : ? 如果沒有消息隊列與健值 key相對應,并且 msgflg中包含了 IPC_CREAT標志位; ? key參數(shù)為 IPC_PRIVATE; 參數(shù) msgflg可以為以下: IPC_CREAT、 IPC_EXCL、 IPC_NOWAIT或三者的或結(jié)果。原因如下: ? 雖然該系統(tǒng)調(diào)用提供了統(tǒng)一的用戶界面,但正是由于這個特性,它的參數(shù)幾乎不能給出特定的實際意義(如以 first、 second 來命名參數(shù)),在一定程度上造成開發(fā)不便。 ? int ipc(MSGSND, int first, int second, int third, void *ptr, long fifth)。 第一個參數(shù)指明對 IPC 對象的操作方式,對消息隊列而言共有四種操作: MSGSND、 MSGRCV、MSGGET以及 MSGCTL,分別代表向消息隊列發(fā)送消 息、從消息隊列讀取消息、打開或創(chuàng)建消息隊列、控制消息隊列; first參數(shù)代表唯一的 IPC對象;下面將介紹四種操作。a39。 獲得或設(shè)置消息隊列屬性: 消息隊列的信息基本上都保存在消息隊列頭中,因此,可以分配一個類似于消息隊列頭的結(jié)構(gòu) (struct msqid_ds,見 附錄 2),來返回消息隊列的屬性;同樣可以設(shè)置該數(shù)據(jù)結(jié)構(gòu)。 char mtext[1]。 mode_t mode。 //該鍵值則唯一對應一個消息隊列 uid_t uid。讀者可以訪問這些信息,也可以設(shè)置其中的某些信息。因此系統(tǒng)中記錄消息隊列的數(shù)據(jù)結(jié)構(gòu)( struct ipc_ids msg_ids)位于內(nèi)核中,系統(tǒng)中的所有消息隊列都可以在結(jié)構(gòu) msg_ids 中找到訪問入口。 Linux內(nèi)核(內(nèi)核 )支持 POSIX信號燈、 POSIX共享內(nèi)存區(qū)以及 POSIX 消息隊列,但對于主流 Linux 發(fā)行版本之一 (內(nèi)核 ),還沒有提供對 POSIX進程間通信 API的支持,不過應該只是時間上的事。消息隊列是隨內(nèi)核持續(xù)的(參見 附錄 1)。作為早期 unix通信機制之一的信號能夠傳送的信息量有限,后來雖然 POSIX 拓廣,使得信號在傳遞信息量方面有了相當程度的改進,但是信號這種通信方式更像 即時 的通信方式,它要求接受信號的進程在某個時間范圍內(nèi)對信號做出反應,因此該信號最多在接受信號進程的生命周期內(nèi)才有意義,信號所傳遞的信息是接 近于隨進程持續(xù)的概念( processpersistent),見 附錄 1;管道及有名管道及有名管道則是典型的隨進程持續(xù) IPC,并且,只能傳送無格式的字節(jié)流無疑會給應用程序開發(fā)帶來不便,另外,它的緩沖區(qū)大小也受到限制。 消息隊列 (也叫做報文隊列)能夠克服早期 unix通信機制的一些缺點。對消息隊列有寫權(quán)限的進程可以向中按照一定的規(guī)則添加新消息;對消息隊列有讀權(quán)限的進程則可以從消息隊列中讀走消息。 在本系列專題的序(深刻理解 Linux進程間通信( IPC))中,提到對于消息隊列、信號燈、以及共享內(nèi)存區(qū)來說,有兩個實現(xiàn)版本: POSIX的以及系統(tǒng) V的。 一、消息隊列基本概念 1. 系統(tǒng) V消息隊列是隨內(nèi)核持續(xù)的,只有在內(nèi)核重起或者顯示刪除一個消息隊列時,該消息隊列才會真正被刪除。隊列頭中包含了該消 息隊列的大量信息,包括消息隊列鍵值、用戶 ID、組 ID、消息隊列中消息數(shù)目等等,甚至記錄了最近對消息隊列讀寫進程的 ID。kern_ipc_perm結(jié)構(gòu)如下: struct kern_ipc_perm{ //內(nèi)核中記錄消息隊列的全局數(shù)據(jù)結(jié)構(gòu) msg_ids能夠訪問到該結(jié)構(gòu); key_t key。 gid_t cgid。 讀寫操作 消息讀寫操作非常簡單,對開發(fā)人員來說,每個消息都類似如下的數(shù)據(jù)結(jié)構(gòu): struct msgbuf{ long mtype。因此,對于發(fā)送消息來說,首先預置一個 msgbuf緩沖區(qū)并寫入消息類型和內(nèi) 容,調(diào)用相應的發(fā)送函數(shù)即可;對讀取消息來說,首先分配這樣一個msgbuf緩沖區(qū),然后把消息讀入該緩沖區(qū)即可。典型的調(diào)用代碼是: key=ftok(path_ptr, 39。 … linux為操作系統(tǒng) V進程間通信的三種方式( 消息隊列、信號燈、共享內(nèi)存區(qū) )提供了一個統(tǒng)一的用戶界面: int ipc(unsigned int call, int first, int second, int third, void *ptr, long fifth)。 ? int ipc(MSGCTL, int first, int second, int third, void *ptr, long fifth) 與該 操作對應的系統(tǒng) V調(diào)用為: int msgctl( first, second, (struct msqid_ds*) ptr)。 與該操作對應的系統(tǒng) V調(diào)用為: int msgrcv( first, (struct msgbuf*)ptr, second, fifth,third), 注:本人不主張采用系統(tǒng)調(diào)用 ipc(),而更傾向于采用系統(tǒng) V或者 POSIX進程間通信 API。該調(diào)用 返回與健值 key相對應的消息隊列描述字 。 2) int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg)。 0。 向 msgid代表的消息隊列發(fā)送一個消息 , 即將 發(fā)送的消息存儲在 msgp指向的 msgbuf結(jié)構(gòu)中 ,消息的大小由 msgze指定。 4) int msgctl(int msqid, int cmd, struct msqid_ds *buf)。 三、消息隊列的限制 每個消息隊列的容量(所能容納的字節(jié)數(shù))都有限制,該值因系統(tǒng)不同而不同。一般來說,實際開發(fā)過程中不會超過這個限制。 key_t key。 char mtext[1]。 }msg_rbuf。a39。 if(msgid==1) { printf(msg create error\n)。 =10。msg_sbuf,sizeof(),sflags)。 reval=msgrcv(msgid,amp。 //從消息隊列中讀出消息后,輸出消息隊列屬性 msg_stat(msgid,msg_ginfo)。 //此處驗證超級用戶可以更改消息隊列的缺省 msg_qbytes //注意這里設(shè)置的值大于缺省值 reval=msgctl(msgid,IPC_SET,amp。 } msg_stat(msgid,msg_ginfo)。 } } void msg_stat(int msgid,struct msqid_ds msg_info) { int reval。 if(reval==1) { printf(get msg info error\n)。 printf(number of messages in queue is %d\n,)。 printf(pid of last msgrcv is %d\n,)。()))。 printf(msg gid is %d\n,)。同樣,消息隊列可以在幾個進程間復用,而不管這幾個進程是否具有親緣關(guān)系,這一點與有名管道很相似;但消息隊列是隨內(nèi)核持續(xù)的,與有名管道(隨進程持續(xù))相比,生命力更強,應用空間更大。 附錄 2: 結(jié)構(gòu) msg_queue用來描述消息隊列頭,存在于系統(tǒng)空間: struct msg_queue { struct kern_ipc_perm q_perm。 /* last change time */ unsigned long q_cbytes。 /* pid of last msgsnd */ pid_t q_lrpid。 }。 /* last message in queue,unused */ __kernel_time_t msg_
點擊復制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1