日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 声明消息函数,linux消息队列函数--解析

發(fā)布時間:2025/3/11 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 声明消息函数,linux消息队列函数--解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

#include www.2cto.com

---------------------------------------------------------------------

1、系統(tǒng)建立IPC通訊(如消息隊列、共享內(nèi)存時)必須指定一個ID值。通常情況下,該id值通過ftok函數(shù)得到。

ftok原型如下:

key_t ftok( char * fname, int id )

fname就時你指定的文件名,id是子序號。

在一般的UNIX實現(xiàn)中,是將文件的索引節(jié)點號取出,前面加上子序號得到key_t的返回值。

如指定文件的索引節(jié)點號為65538,換算成16進制為0x010002,而你指定的ID值為38,換算成16 進制為0x26,則最后的key_t返回值為0x26010002。

查詢文件索引節(jié)點號的方法是: ls -i

當刪除重建文件后,索引節(jié)點號由操作系統(tǒng)根據(jù)當時文件系統(tǒng)的使用情況分配,因此與原來不同,所以得到的索引節(jié)點號也不同。

如果要確保key_t值不變,要目確保ftok的文件不被刪除,要么不用ftok,指定一個固定的key_t 值,比如:

#define IPCKEY 0x111

char path[256];

sprintf( path, "%s/etc/config.ini", (char*)getenv("HOME") );

msgid=ftok( path, IPCKEY );[/code]

同一段程序,用于保證兩個不同用戶下的兩組相同程序獲得互不干擾的IPC鍵值。

由于 etc/config.ini(假定)為應(yīng)用系統(tǒng)的關(guān)鍵配置文件,因此不存在被輕易刪除的問題——即使被刪,也會很快被發(fā)現(xiàn)并重建(此時應(yīng)用系統(tǒng)也將被重起)。

ftok()的設(shè)計目的也在于此。

----------------------------------------------------

2、int msgget(key_t key, int msgflg); //創(chuàng)建消息隊列

參數(shù):

key:消息隊列關(guān)聯(lián)的鍵。為IPC_PRIVATE時表示創(chuàng)建自己的消息隊列

msgflg:消息隊列的建立標志和訪問權(quán)限。msgflg 的低位用來確定消息隊列的訪問權(quán)限。

IPC_CREAT:如果 key不存在,創(chuàng)建

IPC_EXCL:如果 key 存在,返回失敗

IPC_NOWAIT:如果需要等待,直接返回錯誤

如果單獨使用IPC_CREAT,則msgget()要么返回一個新創(chuàng)建的消息隊列的標識符,要么返回具有相同關(guān)鍵字值的隊列的標識符。如果 IPC_EXCL和IPC_CREAT一起使用,則msgget()要么創(chuàng)建一個新的消息隊列,要么如果隊列已經(jīng)存在則返回一個失敗值-1。

返回說明:

如果成功,返回消息隊列標識符

如果失敗,則返回-1:errno=EACCESS(權(quán)限不允許)

EEXIST(隊列已經(jīng)存在,無法創(chuàng)建)

EIDRM(隊列標志為刪除)

ENOENT(隊列不存在)

ENOMEM(創(chuàng)建隊列時內(nèi)存不夠)

ENOSPC(超出最大隊列限制)

www.2cto.com

舉例:

msgid=msgget(IPC_PRIVATE,IPC_CREAT|IPC_EXCL|00666); //創(chuàng)建消息隊列

--------------------------------------------------

3、int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); //將消息送入消息隊列

參數(shù):

msqid:消息隊列的標識符。

msgp:指向消息緩沖區(qū)的指針,此位置用來暫時存儲發(fā)送和接收的消息,是一個用戶可定義的通用結(jié)構(gòu),形態(tài)如下

struct msgbuf {

long mtype;???? /* 消息類型,必須 > 0 */

char mtext[1];? /* 消息文本 */

};

msgsz:消息的大小。

msgflg:用來指明進程在隊列數(shù)據(jù)滿(msgsnd)或空(msgrcv)的情況下所應(yīng)采取的行動。

如果設(shè)置為 IPC_NOWAIT,則在消息隊列已滿時不發(fā)送消息并且調(diào)用進程立即返回錯誤信息EAGAIN。

如果設(shè)置為 0,則調(diào)用進程阻塞直至消息隊列不為滿。

返回說明:

成功執(zhí)行時,msgsnd()返回0, 失敗返回-1

舉例:msgsnd(g_msg_id,&msg_snd,sizeof(msg_snd.msg_item),IPC_NOWAIT); //非阻塞發(fā)送消息

----------------------------------------------------------

4、ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); //從消息隊列讀取信息

參數(shù):

msgtyp:

msgtyp = 0:收取隊列中的第一條消息,任意類型。

msgtyp > 0:收取第一條 msgtyp 類型的消息。

msgtyp < 0:收取第一條最低類型(小于或等于 msgtyp 的絕對值)的消息。

其他參數(shù)參考msgsnd函數(shù)。

返回說明:

成功執(zhí)行時,msgrcv()返回0, 失敗返回-1

舉例:msgrcv(msgid,&msg_rbuf,sizeof(msg_rbuf.msg_item),10,0); //阻塞接收

www.2cto.com

----------------------------------------------------------

5、int msgctl (int msqid, int cmd, struct msqid_ds *buf); //消息隊列屬性控制

參數(shù):

msqid:消息隊列的標識符。

cmd:執(zhí)行的控制命令,即要執(zhí)行的操作。包括以下選項:

IPC_STAT:讀取消息隊列屬性。取得此隊列的msqid_ds 結(jié)構(gòu),并將其存放在buf指向的結(jié)構(gòu)中。

IPC_SET :設(shè)置消息隊列屬性。

IPC_RMID:刪除消息隊列。

IPC_INFO:讀取消息隊列基本情況。此命令等同于 ipcs 命令。

這 4 條命令(IPC_STAT、IPC_SET、IPC_INFO 和 IPC_RMID)也可用于信號量和共享存儲。

buf:臨時的 msqid_ds 結(jié)構(gòu)體類型的變量。用于存儲讀取的消息隊列屬性或需要修改的消息隊列屬性。

舉例:msgctl(qid, IPC_RMID, NULL)? //刪除消息隊列

總結(jié)

以上是生活随笔為你收集整理的linux 声明消息函数,linux消息队列函数--解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。