现在常用的进程间通信的有信号,信号量,消息队列,共享内存。
消息队列是一种比较高级的进程间通信方法,因为它真的可以在进程间传送message,一个消息队列可以被多个进程所共享,如果一个进程的消息太多,一个消息队列放不下,也可以用多于一个的消息队列(不过可能管理会比较复杂)。
共享消息队列的进程所发送的消息除了message本身还有一个标志,这个标志可以指明该消息将由哪个进程或者哪类进程接受,每一个共享消息队列的进程针对这个队列也有自己的标志,可以用来表明自己的身份。
共享消息队列消息发送:
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct msgbuf{
long mtype;
char mtext[255];
};
int main()
{
int msg_id = msgget(123,IPC_CREAT|0666);
if(msg_id != -1)
{
struct msgbuf mybuf;
mybuf.mtype = 1;
strcpy(mybuf.mtext,"I'm send process.\n");
//发送消息
if(msgsnd(msg_id, &mybuf, sizeof(mybuf.mtext),0))
{
printf("success\n");
}
else
{
perror("msgsnd:");//发送
}
}
else
{
perror("msgget:");
}
return 0;
}
共享消息队列消息接收:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct msgbuf{
long mtype;
char mtext[255];
};
int main()
{
int msg_id = msgget(123,IPC_CREAT|0666);
if(msg_id != -1)
{
struct msgbuf mybuf;
if(msgrcv(msg_id,&mybuf,sizeof(mybuf.mtext),0,IPC_NOWAIT) != -1) //接收消息队列的消息
{
printf("read suceess:%s\n",mybuf.mtext);
if(msgctl(msg_id,IPC_RMID,0) != -1)//删除这个消息队列
{
printf("detele msg suceess\n");
}
else
{
perror("msgsnd:");
}
}
}
else
{
perror("msgget:");
}
return 0;
}
信号和信号量是不同的,他们虽然都可以用来实现同步和互斥,但前者是使用信号处理器来进行的,后者是使用P、V操作来实现的。