新聞中心
在 Linux 系統(tǒng)中,msg.h 頭文件是消息隊(duì)列的頭文件,主要包含了建立、關(guān)閉、發(fā)送和接收消息的相關(guān)函數(shù)的聲明。消息隊(duì)列是多個(gè)進(jìn)程之間進(jìn)行異步通信的一種方式,常用于進(jìn)程間通信(IPC)。

本文將對 msg.h 頭文件進(jìn)行詳細(xì)講解,包括消息隊(duì)列的概念、頭文件的結(jié)構(gòu)和函數(shù)使用方法等。
一、消息隊(duì)列的概念
消息隊(duì)列是一種進(jìn)程間通信的方式,它是一段共享內(nèi)存,進(jìn)程可以通過它來傳遞消息。多個(gè)進(jìn)程可以同時(shí)往同一個(gè)消息隊(duì)列中發(fā)送消息和從中讀取消息,并且每個(gè)消息都有一個(gè)類型標(biāo)識。
消息隊(duì)列有以下幾個(gè)特點(diǎn):
1. 消息隊(duì)列是按照先進(jìn)先出的規(guī)則進(jìn)行消息的處理。
2. 消息隊(duì)列中的消息的大小可以自定義,但更大值受系統(tǒng)的限制。
3. 每個(gè)消息都有一個(gè)類型標(biāo)識,可以根據(jù)類型來選擇需要處理的消息。
4. 消息隊(duì)列適合于進(jìn)程間的數(shù)據(jù)量較小,但操作頻繁的場景。
5. 消息隊(duì)列是一種異步通信的方式,不需要等待對方的響應(yīng)。
二、頭文件結(jié)構(gòu)
msg.h 頭文件主要包含了以下幾個(gè)結(jié)構(gòu)體和宏定義:
1. struct msgbuf
該結(jié)構(gòu)體用于保存消息隊(duì)列中的消息,結(jié)構(gòu)體的定義如下:
“`
struct msgbuf {
long mtype; // 消息類型標(biāo)識
char mtext[1]; // 消息內(nèi)容
};
“`
其中,mtype 為消息類型標(biāo)識,是一個(gè)大于 0 的長整型數(shù)值,用于區(qū)分不同類型的消息。mtext 為消息內(nèi)容,是一個(gè)字符數(shù)組,可以保存任意長度的消息。
在使用消息隊(duì)列時(shí),需要根據(jù)實(shí)際情況定義結(jié)構(gòu)體的長度,例如:
“`
struct msgbuf {
long mtype; // 消息類型標(biāo)識
char mtext[1024]; // 消息內(nèi)容
};
“`
2. struct msqid_ds
該結(jié)構(gòu)體用于保存消息隊(duì)列的屬性,結(jié)構(gòu)體的定義如下:
“`
struct msqid_ds {
struct ipc_perm msg_perm; // 消息隊(duì)列的權(quán)限信息
time_t msg_stime; // 最后一次寫入消息隊(duì)列的時(shí)間
time_t msg_rtime; // 最后一次讀取消息隊(duì)列的時(shí)間
time_t msg_ctime; // 消息隊(duì)列的創(chuàng)建時(shí)間
unsigned long msg_cbytes; // 消息隊(duì)列中當(dāng)前的字節(jié)數(shù)
unsigned long msg_qnum; // 消息隊(duì)列中當(dāng)前的消息數(shù)
unsigned long msg_qbytes; // 消息隊(duì)列中允許的更大字節(jié)數(shù)
pid_t msg_lspid; // 最后寫入消息隊(duì)列的進(jìn)程 ID
pid_t msg_lrpid; // 最后讀取消息隊(duì)列的進(jìn)程 ID
};
“`
其中,msg_perm 是消息隊(duì)列的權(quán)限信息,包括擁有者 ID、群組 ID 和權(quán)限標(biāo)志等信息。msg_stime、msg_rtime 和 msg_ctime 分別表示最后一次寫入、讀取和創(chuàng)建消息隊(duì)列的時(shí)間。msg_cbytes 表示消息隊(duì)列中當(dāng)前的字節(jié)數(shù),msg_qnum 表示消息隊(duì)列中當(dāng)前的消息數(shù),而 msg_qbytes 則表示消息隊(duì)列中允許的更大字節(jié)數(shù)。msg_lspid 和 msg_lrpid 分別表示最后寫入和讀取消息隊(duì)列數(shù)據(jù)的進(jìn)程 ID。
3. IPC_PRIVATE
IPC_PRIVATE 是一個(gè)宏定義,用于表示創(chuàng)建一個(gè)新的消息隊(duì)列,其定義如下:
“`
#define IPC_PRIVATE ((__kernel_key_t)0)
“`
當(dāng)使用 IPC_PRIVATE 作為 key 值來創(chuàng)建消息隊(duì)列時(shí),系統(tǒng)將會(huì)為其隨機(jī)生成一個(gè)鍵值,并將該鍵值作為消息隊(duì)列的標(biāo)識符,是一個(gè)唯一的值。這種方式創(chuàng)建的消息隊(duì)列只能在父子進(jìn)程之間進(jìn)行通信。
4. IPC_CREAT
IPC_CREAT 是一個(gè)宏定義,用于表示創(chuàng)建一個(gè)新的消息隊(duì)列或獲取一個(gè)已有的消息隊(duì)列,其定義如下:
“`
#define IPC_CREAT 001000 // 創(chuàng)建新的隊(duì)列或獲取已有隊(duì)列
#define IPC_EXCL 002023 // 與IPC_CREAT一同使用,用于避免消息隊(duì)列編號沖突
“`
當(dāng)使用 IPC_CREAT 和一個(gè)正整數(shù) key 配合使用,系統(tǒng)會(huì)在內(nèi)核的消息隊(duì)列中通過該 key 值查找是否已經(jīng)存在一個(gè)具有相同 key 值的消息隊(duì)列。如果不存在,則創(chuàng)建一個(gè)新的消息隊(duì)列,并返回該消息隊(duì)列的標(biāo)識符;如果已經(jīng)存在,則返回該消息隊(duì)列的標(biāo)識符。當(dāng)同時(shí)使用 IPC_CREAT 和 IPC_EXCL 標(biāo)志時(shí),如果已經(jīng)存在一個(gè)具有相同 key 值的消息隊(duì)列,則創(chuàng)建操作將失敗,返回 -1。
三、消息隊(duì)列相關(guān)函數(shù)
msg.h 頭文件中包含了多個(gè)函數(shù),用于創(chuàng)建、添加、獲取和刪除消息隊(duì)列。其中,常用函數(shù)有:
1. int msgget(key_t key, int msg);
該函數(shù)用于創(chuàng)建或獲取一個(gè)消息隊(duì)列,其參數(shù) key 用于指定消息隊(duì)列的鍵值,msg 用于指定消息隊(duì)列的訪問權(quán)限和創(chuàng)建方式。返回消息隊(duì)列的標(biāo)識符,出錯(cuò)返回 -1。
2. int msgsnd(int msqid, const void *msgp, size_t msgsz, int msg);
該函數(shù)用于向指定消息隊(duì)列中添加消息,其參數(shù) msqid 為消息隊(duì)列的標(biāo)識符,msgp 為消息的指針,msgsz 為消息的長度,msg 為消息的標(biāo)志。返回成功添加消息的長度,出錯(cuò)返回 -1。
3. ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msg);
該函數(shù)用于從指定消息隊(duì)列中讀取消息,其參數(shù) msqid 為消息隊(duì)列的標(biāo)識符,msgp 為消息的指針,msgsz 為消息的長度,msgtyp 為消息類型標(biāo)識,msg 為消息的標(biāo)志。返回讀取到的消息的長度,出錯(cuò)返回 -1。
4. int msgctl(int msqid, int cmd, struct msqid_ds *buf);
該函數(shù)用于控制指定消息隊(duì)列的屬性,其參數(shù) msqid 為消息隊(duì)列的標(biāo)識符,cmd 為操作命令,buf 為消息隊(duì)列的屬性結(jié)構(gòu)體指針。返回成功為 0,出錯(cuò)返回 -1。
其中,cmd 可以設(shè)置為以下值:
– IPC_RMID:刪除指定的消息隊(duì)列;
– IPC_STAT:獲取指定的消息隊(duì)列的屬性;
– IPC_SET:設(shè)置指定的消息隊(duì)列的屬性。
四、使用示例
下面是一個(gè)簡單的使用消息隊(duì)列的示例程序:
“`
#include
#include
#include
#include
#include
#include
#include
struct msgbuf {
long mtype;
char mtext[1024];
};
int mn() {
int msgid;
key_t key;
struct msgbuf buf;
// 創(chuàng)建一個(gè)新的消息隊(duì)列,并獲取其標(biāo)識符
key = ftok(“.”, ‘a(chǎn)’);
msgid = msgget(key, IPC_CREAT | 0666);
if (msgid == -1) {
printf(“msgget error: %s\n”, strerror(errno));
exit(1);
}
// 添加三個(gè)消息
buf.mtype = 1;
strcpy(buf.mtext, “message 1”);
if (msgsnd(msgid, &buf, strlen(buf.mtext), 0) == -1) {
printf(“msgsnd error: %s\n”, strerror(errno));
exit(1);
}
buf.mtype = 2;
strcpy(buf.mtext, “message 2”);
if (msgsnd(msgid, &buf, strlen(buf.mtext), 0) == -1) {
printf(“msgsnd error: %s\n”, strerror(errno));
exit(1);
}
buf.mtype = 1;
strcpy(buf.mtext, “message 3”);
if (msgsnd(msgid, &buf, strlen(buf.mtext), 0) == -1) {
printf(“msgsnd error: %s\n”, strerror(errno));
exit(1);
}
// 讀取消息隊(duì)列中的消息
while(1) {
if (msgrcv(msgid, &buf, 1024, 0, IPC_NOWT) != -1) {
printf(“recvd msg: %s\n”, buf.mtext);
} else {
if (errno != ENOMSG) {
printf(“msgrcv error: %s\n”, strerror(errno));
}
break;
}
}
// 刪除消息隊(duì)列
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
printf(“msgctl error: %s\n”, strerror(errno));
exit(1);
}
return 0;
}
“`
該程序使用 ftok 函數(shù)生成一個(gè)新的鍵值,并調(diào)用 msgget 函數(shù)創(chuàng)建一個(gè)新的消息隊(duì)列,然后使用 msgsnd 函數(shù)向消息隊(duì)列中添加三個(gè)消息,消息類型分別為 1、2 和 1。接著使用 msgrcv 函數(shù)從消息隊(duì)列中讀取所有的消息,并輸出到標(biāo)準(zhǔn)輸出的終端上。最后使用 msgctl 函數(shù)刪除該消息隊(duì)列。
五、
相關(guān)問題拓展閱讀:
- windows與linux 頭文件對照
- Ros中msg創(chuàng)建.h的問題
windows與linux 頭文件對照
別折騰了,重寫吧……
1.linux和windows平臺下,能夠?qū)?yīng)的頭文件就是符合C11標(biāo)準(zhǔn)的頭文件。其他的頭文件不僅和平臺有關(guān)系握畝搏,還和平臺下的編譯環(huán)境有關(guān),很難畫上等號的。
2.C語言符合標(biāo)準(zhǔn)的頭文件
#include //設(shè)定插入點(diǎn)
#include //字符處理
#include //定義錯(cuò)誤碼
#include //浮點(diǎn)數(shù)處理
#include //文件輸入/輸出
#include //參數(shù)化輸入/輸出
#include //數(shù)據(jù)流輸入/輸出
#include //定義各種數(shù)據(jù)類型最值常量
#include //定義本地化函數(shù)
#include //定義數(shù)學(xué)函數(shù)
#include //定義輸入/輸出函數(shù)
#include //定義雜項(xiàng)函數(shù)及內(nèi)存分配函數(shù)
#include //字符串處理
#include //基于數(shù)組的輸入/輸出
#include //定義關(guān)于時(shí)間的函數(shù)
#include //寬字符處理及輸入/輸出
#include //寬字符分類
3.linux常用頭文件如下:
POSIX標(biāo)準(zhǔn)定義的頭文件
目錄項(xiàng)
文件控制
文件名匹配類型
路徑名模式匹配類型
組文件
網(wǎng)絡(luò)數(shù)段祥據(jù)庫操作
口令文件
正則表達(dá)式
TAR歸檔值
終端I/O
符號常量
文件時(shí)間
字符擴(kuò)展類型
INTERNET定義
套接字本地接口
INTERNET地址族
傳輸控制協(xié)議定義
內(nèi)存管理聲明
Select函數(shù)
套接字借口
文件狀態(tài)
進(jìn)程時(shí)間
基本系統(tǒng)數(shù)據(jù)類型
UNIX域套接字定義
系統(tǒng)名
進(jìn)程控制
—
POSIX定義的XSI擴(kuò)展頭文件
cpio歸檔值
動(dòng)態(tài)鏈接
消息顯示結(jié)構(gòu)
文件樹漫游
代碼集轉(zhuǎn)換使用程序
語言信息常量
模式匹配函數(shù)定義
貨幣類型
數(shù)據(jù)庫操作
消息類別
輪詢函數(shù)
搜索表
字符耐舉串操作
系統(tǒng)出錯(cuò)日志記錄
用戶上下文
用戶限制
用戶帳戶數(shù)據(jù)庫
–
IPC(命名管道)
消息隊(duì)列
資源操作
信號量
共享存儲
文件系統(tǒng)信息
時(shí)間類型
附加的日期和時(shí)間定義
矢量I/O操作
—
POSIX定義的可選頭文件
異步I/O
消息隊(duì)列
線程
執(zhí)行調(diào)度
信號量
實(shí)時(shí)spawn接口
XSI STREAMS接口
事件跟蹤
看看紅旗linux,他們出的書具體不太記得了,不過畢竟是中國做得更好的,多看看有幫助。
Linux的一般接口在《Unix環(huán)境高級編程》中有詳細(xì)的描述。
關(guān)于socket,請看《Unix網(wǎng)絡(luò)編程》一書。
如果用型晌圖形界面,那么Linux下通常采用的是GDK和Qt兩個(gè)庫,也就是說,如果你在Windows下使散租慧用了包含圖形界面的庫函數(shù),那么你就必須修改你的所有函數(shù)調(diào)用的實(shí)現(xiàn),而不僅僅是替換頭文件。
要做跨平臺的程序,我推薦你使用沖答Qt,它用C++寫成,對于圖形界面的操作可以直接在Win\Mac\*nix等各種平臺下使用。
祝你好運(yùn)!
應(yīng)該差不多的
Ros中msg創(chuàng)建.h的問題
在安裝好ROS后,接著學(xué)習(xí)如何創(chuàng)建節(jié)點(diǎn)和節(jié)點(diǎn)之間的通信方式,以一個(gè)簡瞎唯穗單的主題發(fā)布節(jié)點(diǎn)和主題訂閱節(jié)點(diǎn)說明。節(jié)點(diǎn)是連接ROS網(wǎng)絡(luò)等可執(zhí)行文件,是實(shí)現(xiàn)某山信些功能的軟件包,也是一個(gè)主要計(jì)算執(zhí)磨卜行的進(jìn)程。
wiki教程上說,在xml和CMakeLists文件里添加相關(guān)依鏈差賴以后,編譯,.msg文件會(huì)被轉(zhuǎn)化成.h文件。
這激碼就是為什么只看源碼找不到部分
頭文件
的原因。你看看是不是xml里沒加build_depends,棚鉛皮或者CMakeLists里面沒加find_packge.
自己測試結(jié)果如下,當(dāng)你按照wiki教程吵悶寫好cmakelist.txt之后,枝仿之一次catkin_make會(huì)生成Num.h。之后就可以猛碰纖 #include 了。
關(guān)于msg.h linux的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
當(dāng)前名稱:Linux下的msg.h頭文件詳解(msg.hlinux)
標(biāo)題URL:http://www.5511xx.com/article/cojhgpd.html


咨詢
建站咨詢
