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

歡迎訪問 生活随笔!

生活随笔

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

linux

linux 消息队列_Linux进程间通信第六讲 标准IPC之消息队列

發(fā)布時(shí)間:2023/12/4 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 消息队列_Linux进程间通信第六讲 标准IPC之消息队列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

來源CSDN:

CSDN-專業(yè)IT技術(shù)社區(qū)-登錄?blog.csdn.net

一、概念和原理

消息隊(duì)列是另一種標(biāo)準(zhǔn)IPC,當(dāng)然也大概遵循大部分標(biāo)準(zhǔn)

消息隊(duì)列,它是存放消息(數(shù)據(jù))的隊(duì)列,而隊(duì)列是先進(jìn)先出的線性數(shù)據(jù)結(jié)構(gòu)

換句話說,我們就是利用這個(gè)數(shù)據(jù)結(jié)構(gòu) 進(jìn)行進(jìn)程間的通信

消息隊(duì)列允許多個(gè)進(jìn)程同時(shí)讀寫消息.由于消息可以定義很多類型,取出時(shí)可以指定哪個(gè)消息類型取出,所以消息隊(duì)列解決了共享內(nèi)存多個(gè)進(jìn)程同時(shí)讀寫時(shí)數(shù)據(jù)混亂的問題,只要把消息標(biāo)定不同的類型即可

二、使用

1)通過ftok獲取key

2)通過key 創(chuàng)建/獲取 消息隊(duì)列 ------- msgget

參數(shù):

key - 上一步獲取的key

msgflg - 創(chuàng)建標(biāo)志和權(quán)限

IPC_CREAT|0666

成功返回消息隊(duì)列ID,失敗返回-1

3)把消息 存入隊(duì)列 / 從隊(duì)列中取出 ----------- msgsnd/msgrcv

參數(shù):msqid - 消息隊(duì)列IDmsgq - 消息首地址msgsz - 消息長度(消息數(shù)據(jù)的長度)msgtyp - 用來指定接收什么類型的消息(僅僅接收消息時(shí)才有)0:接收任意類型消息(第一個(gè),先進(jìn)先出)>0:接收類型為msgtyp的特定消息<0:接收類型 小于等于 msgtyp絕對(duì)值的小,類型從小到大接收msgflg - 接收/發(fā)送 標(biāo)識(shí)0表示阻塞方式操作,接收消息沒有消息可接收/發(fā)送消息消息隊(duì)列滿了 就會(huì)等待直到成功IPC_NOWAIT表示非阻塞方式操作,接收消息沒有消息可接收/發(fā)送消息消息隊(duì)列滿了 直接返回錯(cuò)誤

msgsnd成功返回0,msgrcv成功返回收到消息的消息數(shù)據(jù)長度,失敗都返回-1

另外,消息類型在系統(tǒng)中是未定義的,所以程序員需要在代碼中自己定義消息的類型,但是必須按照以下形式:

struct msgbuf {long mtype; /* 消息類型, 必須大于0 */char mtext[1]; /* 消息數(shù)據(jù), 即存放的數(shù)據(jù) */};

4)不再使用可以刪除消息隊(duì)列 ------- msgctl

參數(shù):msqid - 消息隊(duì)列IDcmd - 命令I(lǐng)PC_RMID:刪除IPC_SET: 修改IPC_STAT: 獲取buf - 設(shè)置/獲取 時(shí) 傳入/傳出 消息隊(duì)列的信息, 下面是它的數(shù)據(jù)類型 ,其中可以修改的是uid、gid和mode

msgctl函數(shù)成功返回0,失敗返回-1

struct msqid_ds {struct ipc_perm msg_perm; /* Ownership and permissions */time_t msg_stime; /* 最后發(fā)送消息時(shí)間 */time_t msg_rtime; /* 最后接收消息時(shí)間 */time_t msg_ctime; /* 最后修改時(shí)間 */unsigned long __msg_cbytes; /* 當(dāng)前使用消息隊(duì)列空間大小 (nonstandard) */msgqnum_t msg_qnum; /* 當(dāng)前消息個(gè)數(shù) */msglen_t msg_qbytes; /* 消息隊(duì)列最大長度 */pid_t msg_lspid; /* 最后發(fā)送消息的PID */pid_t msg_lrpid; /* 最后接收消息的PID */};struct ipc_perm {key_t __key; /* Key supplied to msgget(2) */uid_t uid; /* Effective UID of owner */gid_t gid; /* Effective GID of owner */uid_t cuid; /* Effective UID of creator */gid_t cgid; /* Effective GID of creator */unsigned short mode; /* Permissions */unsigned short __seq; /* Sequence number */};

消息隊(duì)列發(fā)送端代碼如下:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/msg.h>struct MSG{long mtype;char mtext[100]; };int main() {//1.獲取keykey_t key = ftok(".",'x');if(key==-1){perror("ftok");exit(-1);}//2.創(chuàng)建消息隊(duì)列int msqid = msgget(key,IPC_CREAT|0666);if(msqid==-1){perror("shmget");exit(-1);}//3.發(fā)送消息struct MSG msg1;msg1.mtype = 1;//類型1strcpy(msg1.mtext,"liubei");int res = msgsnd(msqid,&msg1,sizeof(msg1.mtext),0);if(res==-1){perror("msgsnd");exit(-1);}msg1.mtype = 2;//類型2strcpy(msg1.mtext,"guanyu");res = msgsnd(msqid,&msg1,sizeof(msg1.mtext),0);if(res==-1){perror("msgsnd");exit(-1);}printf("消息發(fā)送成功!n");return 0; }

消息隊(duì)列接收端代碼如下:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/msg.h> #include <errno.h>extern int errno;struct MSG{long mtype;char mtext[100]; };int main() {//1.獲取keykey_t key = ftok(".",'x');if(key==-1){perror("ftok");exit(-1);}//2.獲取消息隊(duì)列int msqid = msgget(key,0);if(msqid==-1){perror("shmget");exit(-1);}//3.接收消息struct MSG msg1;while(1){//類型-2,方式非阻塞int res = msgrcv(msqid,&msg1,sizeof(msg1.mtext),/*-2*/0,IPC_NOWAIT);//接收完成刪除消息隊(duì)列if(res==-1&&errno==ENOMSG){break;}else if(res==-1&&errno!=ENOMSG){perror("msgrcv");exit(-1);}else{printf("消息類型 = %ld,消息內(nèi)容 = %sn",msg1.mtype,msg1.mtext);}}msgctl(msqid,IPC_RMID,0);printf("消息隊(duì)列刪除成功!n");return 0; }

輸出如下:

liaowenbindeMacBook-Pro:3 liaowenbin$ ./4msg 消息發(fā)送成功! liaowenbindeMacBook-Pro:3 liaowenbin$ gcc 5msg.c -o 5msg liaowenbindeMacBook-Pro:3 liaowenbin$ ./5msg 消息類型 = 1,消息內(nèi)容 = liubei 消息類型 = 2,消息內(nèi)容 = guanyu 消息隊(duì)列刪除成功!

總結(jié)

以上是生活随笔為你收集整理的linux 消息队列_Linux进程间通信第六讲 标准IPC之消息队列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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