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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux.调整收发队列,linux消息队列通信

發(fā)布時(shí)間:2025/4/16 linux 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux.调整收发队列,linux消息队列通信 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

程序目的:學(xué)習(xí)linux消息隊(duì)列通信

所用主要函數(shù):msgget(),msgsnd(),msgrcv(),msgctl()

首先介紹每個(gè)函數(shù)的用法:

(1)msgget

使用格式:

#include

#include

#include

int msgget(key_t k e y, int? f l a g) ;

功能:是打開(kāi)一個(gè)現(xiàn)存隊(duì)列或創(chuàng)建一個(gè)新隊(duì)列。

返回值:成功執(zhí)行時(shí),返回消息隊(duì)列標(biāo)識(shí)值。失敗返回-1,有時(shí)也會(huì)返回0,這個(gè)時(shí)候也是可以正常使用的。

參數(shù)key:消息隊(duì)列關(guān)聯(lián)的鍵,可以直接賦值設(shè)為固定的的鍵值。也可以用ftok()。

也介紹一下ftok函數(shù)key_t ftok( char * fname, int id )

fname就是你指定的文件名(已經(jīng)存在的文件名),一般使用當(dāng)前目錄;id是子序號(hào)。

這樣就能得到一個(gè)固定的key_t值。

參數(shù)f l a g:消息隊(duì)列的建立標(biāo)志和存取權(quán)限,建立標(biāo)志一般為指定為IPC_CREAT和IPC_EXCL標(biāo)志 。

IPC_CREAT:如果內(nèi)核中沒(méi)有此隊(duì)列,則創(chuàng)建它。當(dāng)IPC_CREAT和IPC_EXCL一起使用時(shí),如果隊(duì)列已經(jīng)存在,則失敗。

例:msgget(ftok("./file",123),IPC_CREAT |0666)

(2)msgsnd

功能:在消息隊(duì)列上進(jìn)行收發(fā)消息。為了發(fā)送消息,調(diào)用進(jìn)程對(duì)消息隊(duì)列必須有寫權(quán)能。接收消息時(shí)必須有讀權(quán)能。

使用格式:

#include

#include

#include

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

返回值:成功執(zhí)行時(shí),返回消息隊(duì)列標(biāo)識(shí)值。失敗返回-1。

參數(shù):

msqid:消息隊(duì)列的識(shí)別碼。

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

struct msgbuf {

long mtype; //消息類型,必須 大于0

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

};

msgsz:消息的大小。

msgflg:用來(lái)指明核心程序在隊(duì)列沒(méi)有數(shù)據(jù)的情況下所應(yīng)采取的行動(dòng)。當(dāng)msgflg為IPC_NOWAIT不會(huì)阻塞。當(dāng)msgflg為0時(shí)msgsnd()在隊(duì)列呈滿或呈空的情形時(shí),采取阻塞等待的處理模式。

(3)msgrcv

使用格式:

#include

#include

#include

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

參數(shù):(同上2)

msgtyp:消息類型

其他參數(shù)同上(2)。

(4)msgctl

原型: int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );

返回值: 如果成功為0 錯(cuò)誤返回- 1。

參數(shù)msgqid :是消息隊(duì)列對(duì)象的標(biāo)識(shí)符。

第二個(gè)參數(shù)cmd:是函數(shù)要對(duì)消息隊(duì)列進(jìn)行的操作,它可以是:

IPC_STAT取出系統(tǒng)保存的消息隊(duì)列的msqid_ds 數(shù)據(jù),并將其存入?yún)?shù)buf 指向的msqid_ds 結(jié)構(gòu)

中。

IPC_SET設(shè)定消息隊(duì)列的msqid_ds 數(shù)據(jù)中的msg_perm 成員。設(shè)定的值由buf 指向的msqid_ds

結(jié)構(gòu)給出。

IPC_EMID將隊(duì)列從系統(tǒng)內(nèi)核中刪除。

這三個(gè)命令的功能都是明顯的。唯一需要強(qiáng)調(diào)的是在IPC_STAT

命令中隊(duì)列的msqid_ds 數(shù)據(jù)中唯一能被設(shè)定的只有msg_perm 成員,是ipc_perm 類型的

數(shù)據(jù)。而ipc_perm 中能被修改的只有mode,pid 和uid 成員。其他的都是只能由系統(tǒng)來(lái)設(shè)定

的。

******************************有關(guān)范例*********************************************

下面就看一個(gè)用消息隊(duì)列通信寫的一個(gè)簡(jiǎn)單的銀行取號(hào)小程序:

在這里我用到了兩個(gè)進(jìn)程:msgc.c? 和 msg.c

(1)msg.c

#include

#include

#include

#include

#include

#define MSG_KEY 8888

struct mymesg{

long mtype;//消息類型

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

};

int main(void)

{

int msgid;

struct msqid_ds buf;

struct mymesg mymsg;

msgid=msgget(MSG_KEY,IPC_CREAT |0600);//創(chuàng)建一個(gè)新隊(duì)列

if(-1==msgid)

{

perror("msggit");

exit(EXIT_FAILURE);

}

while(1)

{

printf("請(qǐng)輸入號(hào)碼和內(nèi)容:\n");

scanf("%d %s",&mymsg.mtype,mymsg.mtext);

msgsnd(msgid,&mymsg,strlen(mymsg.mtext)+1,0);//發(fā)送mymsg中的信息到msgid對(duì)應(yīng)的消息隊(duì)列

}

return 0;

}

(2)msg.c

#include

#include

#include

#include

#include

#define MSG_KEY 8888

struct mymesg{

long mtype;

char mtext[512];

};

int main(void)

{

int msgid;

struct mymesg mymsgrcv;

msgid=msgget(MSG_KEY,IPC_CREAT |0600);

if(-1==msgid)

{

perror("msggit");

exit(EXIT_FAILURE);

}

while(1)

{

printf("請(qǐng)選擇號(hào)碼:");

scanf("%d",&mymsgrcv.mtype);

int ms=msgrcv(msgid,&mymsgrcv,512,mymsgrcv.mtype,0);//接收消息隊(duì)列相應(yīng)類型(號(hào)碼)信息

if(-1==ms)

{

perror("msgrcv");

exit(EXIT_FAILURE);

}

printf("received:%s\n",mymsgrcv.mtext);

}

int msg=msgctl(msgid,IPC_RMID,0);//將隊(duì)列從系統(tǒng)內(nèi)核中刪除。

if(-1==msg)

{

perror("msgctl");

exit(EXIT_FAILURE);

}

return 0;

}

/*********************程序運(yùn)行結(jié)果*********************

[root@localhost msg]#gcc -o msg.c msg.c

[root@localhost msg]# ./msg.c第一個(gè)進(jìn)程

請(qǐng)輸入號(hào)碼和內(nèi)容:

1? Personal business

請(qǐng)輸入號(hào)碼和內(nèi)容:

2?? company business

請(qǐng)輸入號(hào)碼和內(nèi)容:

3?? Other business

[root@localhost msg]# gcc -o msgc.c msgc.c

[root@localhost msg]# ./msgc.c第二個(gè)進(jìn)程

請(qǐng)選擇號(hào)碼:1

received:Personal business

請(qǐng)選擇號(hào)碼:2

received:company business

……

***********************************************************/

本人初學(xué)者,在寫本博文中可能有一些不當(dāng)?shù)牡胤?#xff0c;歡迎大家向我指正。

總結(jié)

以上是生活随笔為你收集整理的linux.调整收发队列,linux消息队列通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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