日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux下的msg.h頭文件詳解(msg.hlinux)

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

本文將對 msg.h 頭文件進行詳細講解,包括消息隊列的概念、頭文件的結(jié)構(gòu)和函數(shù)使用方法等。

一、消息隊列的概念

消息隊列是一種進程間通信的方式,它是一段共享內(nèi)存,進程可以通過它來傳遞消息。多個進程可以同時往同一個消息隊列中發(fā)送消息和從中讀取消息,并且每個消息都有一個類型標(biāo)識。

消息隊列有以下幾個特點:

1. 消息隊列是按照先進先出的規(guī)則進行消息的處理。

2. 消息隊列中的消息的大小可以自定義,但更大值受系統(tǒng)的限制。

3. 每個消息都有一個類型標(biāo)識,可以根據(jù)類型來選擇需要處理的消息。

4. 消息隊列適合于進程間的數(shù)據(jù)量較小,但操作頻繁的場景。

5. 消息隊列是一種異步通信的方式,不需要等待對方的響應(yīng)。

二、頭文件結(jié)構(gòu)

msg.h 頭文件主要包含了以下幾個結(jié)構(gòu)體和宏定義:

1. struct msgbuf

該結(jié)構(gòu)體用于保存消息隊列中的消息,結(jié)構(gòu)體的定義如下:

“`

struct msgbuf {

long mtype; // 消息類型標(biāo)識

char mtext[1]; // 消息內(nèi)容

};

“`

其中,mtype 為消息類型標(biāo)識,是一個大于 0 的長整型數(shù)值,用于區(qū)分不同類型的消息。mtext 為消息內(nèi)容,是一個字符數(shù)組,可以保存任意長度的消息。

在使用消息隊列時,需要根據(jù)實際情況定義結(jié)構(gòu)體的長度,例如:

“`

struct msgbuf {

long mtype; // 消息類型標(biāo)識

char mtext[1024]; // 消息內(nèi)容

};

“`

2. struct msqid_ds

該結(jié)構(gòu)體用于保存消息隊列的屬性,結(jié)構(gòu)體的定義如下:

“`

struct msqid_ds {

struct ipc_perm msg_perm; // 消息隊列的權(quán)限信息

time_t msg_stime; // 最后一次寫入消息隊列的時間

time_t msg_rtime; // 最后一次讀取消息隊列的時間

time_t msg_ctime; // 消息隊列的創(chuàng)建時間

unsigned long msg_cbytes; // 消息隊列中當(dāng)前的字節(jié)數(shù)

unsigned long msg_qnum; // 消息隊列中當(dāng)前的消息數(shù)

unsigned long msg_qbytes; // 消息隊列中允許的更大字節(jié)數(shù)

pid_t msg_lspid; // 最后寫入消息隊列的進程 ID

pid_t msg_lrpid; // 最后讀取消息隊列的進程 ID

};

“`

其中,msg_perm 是消息隊列的權(quán)限信息,包括擁有者 ID、群組 ID 和權(quán)限標(biāo)志等信息。msg_stime、msg_rtime 和 msg_ctime 分別表示最后一次寫入、讀取和創(chuàng)建消息隊列的時間。msg_cbytes 表示消息隊列中當(dāng)前的字節(jié)數(shù),msg_qnum 表示消息隊列中當(dāng)前的消息數(shù),而 msg_qbytes 則表示消息隊列中允許的更大字節(jié)數(shù)。msg_lspid 和 msg_lrpid 分別表示最后寫入和讀取消息隊列數(shù)據(jù)的進程 ID。

3. IPC_PRIVATE

IPC_PRIVATE 是一個宏定義,用于表示創(chuàng)建一個新的消息隊列,其定義如下:

“`

#define IPC_PRIVATE ((__kernel_key_t)0)

“`

當(dāng)使用 IPC_PRIVATE 作為 key 值來創(chuàng)建消息隊列時,系統(tǒng)將會為其隨機生成一個鍵值,并將該鍵值作為消息隊列的標(biāo)識符,是一個唯一的值。這種方式創(chuàng)建的消息隊列只能在父子進程之間進行通信。

4. IPC_CREAT

IPC_CREAT 是一個宏定義,用于表示創(chuàng)建一個新的消息隊列或獲取一個已有的消息隊列,其定義如下:

“`

#define IPC_CREAT 001000 // 創(chuàng)建新的隊列或獲取已有隊列

#define IPC_EXCL 002023 // 與IPC_CREAT一同使用,用于避免消息隊列編號沖突

“`

當(dāng)使用 IPC_CREAT 和一個正整數(shù) key 配合使用,系統(tǒng)會在內(nèi)核的消息隊列中通過該 key 值查找是否已經(jīng)存在一個具有相同 key 值的消息隊列。如果不存在,則創(chuàng)建一個新的消息隊列,并返回該消息隊列的標(biāo)識符;如果已經(jīng)存在,則返回該消息隊列的標(biāo)識符。當(dāng)同時使用 IPC_CREAT 和 IPC_EXCL 標(biāo)志時,如果已經(jīng)存在一個具有相同 key 值的消息隊列,則創(chuàng)建操作將失敗,返回 -1。

三、消息隊列相關(guān)函數(shù)

msg.h 頭文件中包含了多個函數(shù),用于創(chuàng)建、添加、獲取和刪除消息隊列。其中,常用函數(shù)有:

1. int msgget(key_t key, int msg);

該函數(shù)用于創(chuàng)建或獲取一個消息隊列,其參數(shù) key 用于指定消息隊列的鍵值,msg 用于指定消息隊列的訪問權(quán)限和創(chuàng)建方式。返回消息隊列的標(biāo)識符,出錯返回 -1。

2. int msgsnd(int msqid, const void *msgp, size_t msgsz, int msg);

該函數(shù)用于向指定消息隊列中添加消息,其參數(shù) msqid 為消息隊列的標(biāo)識符,msgp 為消息的指針,msgsz 為消息的長度,msg 為消息的標(biāo)志。返回成功添加消息的長度,出錯返回 -1。

3. ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msg);

該函數(shù)用于從指定消息隊列中讀取消息,其參數(shù) msqid 為消息隊列的標(biāo)識符,msgp 為消息的指針,msgsz 為消息的長度,msgtyp 為消息類型標(biāo)識,msg 為消息的標(biāo)志。返回讀取到的消息的長度,出錯返回 -1。

4. int msgctl(int msqid, int cmd, struct msqid_ds *buf);

該函數(shù)用于控制指定消息隊列的屬性,其參數(shù) msqid 為消息隊列的標(biāo)識符,cmd 為操作命令,buf 為消息隊列的屬性結(jié)構(gòu)體指針。返回成功為 0,出錯返回 -1。

其中,cmd 可以設(shè)置為以下值:

– IPC_RMID:刪除指定的消息隊列;

– IPC_STAT:獲取指定的消息隊列的屬性;

– IPC_SET:設(shè)置指定的消息隊列的屬性。

四、使用示例

下面是一個簡單的使用消息隊列的示例程序:

“`

#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)建一個新的消息隊列,并獲取其標(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);

}

// 添加三個消息

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);

}

// 讀取消息隊列中的消息

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;

}

}

// 刪除消息隊列

if (msgctl(msgid, IPC_RMID, NULL) == -1) {

printf(“msgctl error: %s\n”, strerror(errno));

exit(1);

}

return 0;

}

“`

該程序使用 ftok 函數(shù)生成一個新的鍵值,并調(diào)用 msgget 函數(shù)創(chuàng)建一個新的消息隊列,然后使用 msgsnd 函數(shù)向消息隊列中添加三個消息,消息類型分別為 1、2 和 1。接著使用 msgrcv 函數(shù)從消息隊列中讀取所有的消息,并輸出到標(biāo)準(zhǔn)輸出的終端上。最后使用 msgctl 函數(shù)刪除該消息隊列。

五、

相關(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è)定插入點

#include //字符處理

#include //定義錯誤碼

#include //浮點數(shù)處理

#include //文件輸入/輸出

#include //參數(shù)化輸入/輸出

#include //數(shù)據(jù)流輸入/輸出

#include //定義各種數(shù)據(jù)類型最值常量

#include //定義本地化函數(shù)

#include //定義數(shù)學(xué)函數(shù)

#include //定義輸入/輸出函數(shù)

#include //定義雜項函數(shù)及內(nèi)存分配函數(shù)

#include //字符串處理

#include //基于數(shù)組的輸入/輸出

#include //定義關(guān)于時間的函數(shù)

#include //寬字符處理及輸入/輸出

#include //寬字符分類

3.linux常用頭文件如下:

POSIX標(biāo)準(zhǔn)定義的頭文件

目錄項

文件控制

文件名匹配類型

路徑名模式匹配類型

組文件

網(wǎng)絡(luò)數(shù)段祥據(jù)庫操作

口令文件

正則表達式

TAR歸檔值

終端I/O

符號常量

文件時間

字符擴展類型

INTERNET定義

套接字本地接口

INTERNET地址族

傳輸控制協(xié)議定義

內(nèi)存管理聲明

Select函數(shù)

套接字借口

文件狀態(tài)

進程時間

基本系統(tǒng)數(shù)據(jù)類型

UNIX域套接字定義

系統(tǒng)名

進程控制

POSIX定義的XSI擴展頭文件

cpio歸檔值

動態(tài)鏈接

消息顯示結(jié)構(gòu)

文件樹漫游

代碼集轉(zhuǎn)換使用程序

語言信息常量

模式匹配函數(shù)定義

貨幣類型

數(shù)據(jù)庫操作

消息類別

輪詢函數(shù)

搜索表

字符耐舉串操作

系統(tǒng)出錯日志記錄

用戶上下文

用戶限制

用戶帳戶數(shù)據(jù)庫

IPC(命名管道)

消息隊列

資源操作

信號量

共享存儲

文件系統(tǒng)信息

時間類型

附加的日期和時間定義

矢量I/O操作

POSIX定義的可選頭文件

異步I/O

消息隊列

線程

執(zhí)行調(diào)度

信號量

實時spawn接口

XSI STREAMS接口

事件跟蹤

看看紅旗linux,他們出的書具體不太記得了,不過畢竟是中國做得更好的,多看看有幫助。

Linux的一般接口在《Unix環(huán)境高級編程》中有詳細的描述。

關(guān)于socket,請看《Unix網(wǎng)絡(luò)編程》一書。

如果用型晌圖形界面,那么Linux下通常采用的是GDK和Qt兩個庫,也就是說,如果你在Windows下使散租慧用了包含圖形界面的庫函數(shù),那么你就必須修改你的所有函數(shù)調(diào)用的實現(xiàn),而不僅僅是替換頭文件。

要做跨平臺的程序,我推薦你使用沖答Qt,它用C++寫成,對于圖形界面的操作可以直接在Win\Mac\*nix等各種平臺下使用。

祝你好運!

應(yīng)該差不多的

Ros中msg創(chuàng)建.h的問題

在安裝好ROS后,接著學(xué)習(xí)如何創(chuàng)建節(jié)點和節(jié)點之間的通信方式,以一個簡瞎唯穗單的主題發(fā)布節(jié)點和主題訂閱節(jié)點說明。節(jié)點是連接ROS網(wǎng)絡(luò)等可執(zhí)行文件,是實現(xiàn)某山信些功能的軟件包,也是一個主要計算執(zhí)磨卜行的進程。

wiki教程上說,在xml和CMakeLists文件里添加相關(guān)依鏈差賴以后,編譯,.msg文件會被轉(zhuǎn)化成.h文件。

這激碼就是為什么只看源碼找不到部分

頭文件

的原因。你看看是不是xml里沒加build_depends,棚鉛皮或者CMakeLists里面沒加find_packge.

自己測試結(jié)果如下,當(dāng)你按照wiki教程吵悶寫好cmakelist.txt之后,枝仿之一次catkin_make會生成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ù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


網(wǎng)站題目:Linux下的msg.h頭文件詳解(msg.hlinux)
當(dāng)前網(wǎng)址:http://www.dlmjj.cn/article/cojhgpd.html