我们知道进程间通信采用管道时,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