Linux进程间通信(ipc)——消息队列

消息队列是全双工通信方式,双方可以同时读写数据,读写数据后,数据依然在队列中没有消失。进行通信的两个进程所用的消息队列代码基本一样。
队列是个链表,linux内核中有多个队列,每个队列都有自己的ID号,读取和写入都需要在同一个消息队列里面进行。
消息队列进项通信的进程1:

int msgget(key_t key, int msgflg);/key为索引值可以使用ftok(系统IPC键值转换函数)生成 查询文件索引节点号的方法:ls -i
key_t ftok(const char *pathname, int proj_id);
如:
key_t key;
key = ftok(".",1);pathname路径为当前路径,proj_id可以随便填,可以是字符可以是整数,如果是字符要加单引号。

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
size_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
int msgctl(int msqid, int cmd, struct msqid_ds *buf);//消息队列移除,为防止系统中存在过多的消息队列。第一个参数是消息队列的id,第二个为IPC_RMID,第三个通常为NULL。

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<string.h>

//int msgget(key_t key, int msgflg);
//key值可以使用ftok(系统IPC键值转换函数)生成
/*key_t ftok(const char *pathname, int proj_id);
如:
key_t key;
key = ftok(".",1);pathname路径为当前路径,proj_id可以随便填,可以是字符可以是整数,如果是字符要加单引号。
*/
//int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
//size_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);

struct msgbuf {                                          //定义通信数据结构体,其中包括通信数据类型,和数据,相当于通信协议
               long mtype;       /* message type, must be > 0 */
               char mtext[128];    /* message data */
           };


int main()
{
    int rcv;
    struct msgbuf sndbuf = {888,"this is from msgGet"};            //将传输的数据定义类型为888,数据位this is from msgGet
    struct msgbuf rcvbuf;                                          //接受数据的结构体不需要定义,在msgrcv中需要输入数据类型。
    int msgId = msgget(0x1234,IPC_CREAT|0777);                     //创建消息队列键值可以由ftok获取

    if(msgId == -1 ){

            printf("msgque creat failure\n");
    }

    msgsnd(msgId,&sndbuf,strlen(sndbuf.mtext),0);                  //发送数据,最后的msgflg可以默认为0
    rcv = msgrcv(msgId,&rcvbuf,sizeof(rcvbuf.mtext),999,0);        //接受数据需要定义接受数据的类型
    printf("read form snd %d byte,context is %s\n",rcv,rcvbuf.mtext);

    msgctl(msgId,IPC_RMID,NULL); //将消息队列的链表从内核中移除

    return 0;
}

消息队列进行通信的队列2:

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<string.h>

//int msgget(key_t key, int msgflg);
//int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
//size_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);

struct msgbuf {
               long mtype;       /* message type, must be > 0 */
               char mtext[128];    /* message data */
           };


int main()
{
    int rcv;
    struct msgbuf sndbuf = {999,"this is from msgsnd"};
    struct msgbuf rcvbuf;
    int msgId = msgget(0x1234,IPC_CREAT|0777);

    if(msgId == -1 ){

            printf("msgque creat failure\n");
    }

    msgsnd(msgId,&sndbuf,strlen(sndbuf.mtext),0);
    rcv = msgrcv(msgId,&rcvbuf,sizeof(rcvbuf.mtext),888,0);
    printf("read %d byte from Get,contxt is %s\n",rcv,rcvbuf.mtext);

   msgctl(msgId,IPC_RMID,NULL);//将消息队列的链表从内核中移除
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值