同一消息队列通信:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h> //要加这个头文件
struct msgbuf{
long mtype;
char mtext[100];
}; //存放消息类型和消息内容的结构体
int main()
{
key_t key;
int msgid;
struct msgbuf msg1,msg2; //msg1用来发送,msg2用来接收
key=ftok(".", 0xf0); //获得消息队列标识符
if( (msgid = msgget(key, IPC_CREAT|0666)) < 0 ) //创建一个消息队列
{
perror("msgget error");
exit(1);
}
msg1.mtype = 1; //消息类型为1,这个可以区别多个消息
memset(msg1.mtext, 0, 100); //将数组清0
strcpy(msg1.mtext, "hello"); //用strcpy给消息内容赋值
msgsnd(msgid, &msg1, strlen(msg1.mtext)+1, 0); //发送时后加上一个‘’
printf("send %s ", msg1.mtext);
msgrcv(msgid, &msg2, 100, 1, 0); //接收1发过来的消息,存到msg2中
printf("receive %s ", msg2.mtext);
msgctl(msgid, IPC_RMID,NULL); //删除消息队列
return 0;
}
  进程间消息队列通信:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <string.h>
#include <signal.h>
struct msgbuf{
int mtype;
char mtext[100];
};
int main()
{
key_t key;
pid_t pid;
int msgid;
struct msgbuf msg;
key=ftok(".", 0x01);
if ( (msgid = msgget(key, IPC_CREAT|0666)) <0 )
{
perror("msgget error");
exit(1);
}
//创建一个进程
if ( (pid = fork()) < 0 )
{
perror("fork error");
exit(1);
}
//子进程收信息
else if (pid==0)
{
while(1)
{
memset(msg.mtext,0,100);
msgrcv(msgid,&msg,100,2,0); //receive the msg from 2
printf(" bbb:%s aaa:",msg.mtext);
fflush(stdout);
}
exit(0);
}
//父进程发信息
else
{
while(1)
{
memset(msg.mtext,0,100);
printf("aaa:");
fgets(msg.mtext,100,stdin);
if (strncmp("bye",msg.mtext,3)==0)//如果前3个字符为bye,则退出
{
kill(pid,SIGSTOP);
exit(1);
}
msg.mtype=1;//send to 1
msg.mtext[strlen(msg.mtext)-1]='';
msgsnd(msgid,&msg,strlen(msg.mtext)+1,0);
}
}
return 0;
}