进程间通信——消息队列

我们知道进程间通信采用管道时,a 进程给 b 进程传输数据,只能等待 b 进程取了数据之后 a 进程才能返回。所以管道不适合频繁通信的进程。那我们能不能把进程的数据放在某个内存之后就马上让进程返回呢?无需等待其他进程来取就返回呢?答是可以的,我们可以用消息队列的通信模式来解决这个问题,例如 a 进程要给 b 进程发送消息,只需要把消息放在对应的消息队列里就行了,b 进程需要的时候再去对应的消息队列里取出来。同理,b 进程要个 a 进程发送消息也是一样。这种通信方式也类似于缓存吧。

下面来看代码实现

send.c

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <sys/ipc.h> //ftok()
#include <sys/msg.h>

typedef struct {
    long type;
    char name[20];
    int age;
}Msg;

int main()
{
    key_t key = ftok("/home/yijun/project", '6');
    printf("key:============== %d\n", key);
    int msgid = msgget(key, IPC_CREAT|O_WRONLY|0777);
    printf("msgid======%d\n", msgid);
    if(msgid < 0)
    {
        printf("msgget error!======\n");
        exit(-1);
    }
    Msg msg;
    puts("please input your type name age:");
    scanf("%ld%s%d", &msg.type, msg.name, &msg.age);
    msgsnd(msgid, &msg, sizeof(msg) - sizeof(msg.type), 0);

    printf("Hello World!\n");
    return 0;
}

receive.c

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct {
    long type;
    char name[20];
    int age;
}Msg;

int main()
{
    key_t key = ftok("/home/yijun/project", '6');
    printf("key:============== %d\n", key);
    int msgid = msgget(key, O_RDONLY);
    printf("msgid:============== %d\n", msgid);
    if(msgid < 0)
    {
        perror("msgget error!");
        exit(-1);
    }
    Msg rcv;
    long type;
    puts("please input type you want!");
    scanf("%ld", &type);
    msgrcv(msgid, &rcv, sizeof(rcv) - sizeof(type), type, 0);
    printf("receive--- name:%s age:%d\n", rcv.name, rcv.age);
    msgctl(msgid, IPC_RMID, NULL);//删除消息队列对象

    printf("Hello World!\n");
    return 0;
}

 

运行结果

 

 

参考:

https://www.cnblogs.com/liudw-0215/p/8978945.html

http://www.cnblogs.com/linshui91/archive/2010/09/29/1838770.html

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值