1. 举例实现无亲缘关系的进程间如何进行通信。
消息队列不像共享内存的流程,它不需要信号通知。
消息队列的另一个特点:信息读取完自动删除;可以阻塞
2. 示例一,单向通信
Write.c
#include "sys/types.h"
#include "sys/msg.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct msgbuf
{
long type;
char voltage[124];
char ID[4];
};
int main()
{
int msgid;
int readret;
int key;
struct msgbuf sendbuf,recvbuf;
key=ftok("./b.c",'a');
if(key < 0)
{
printf("creat key failure\n");
return -2;
}
msgid=msgget(key,IPC_CREAT|0777);
if(msgid <0)
{
printf("creat message queue failure\n");
return -1;
}
printf("creat message queue sucess msgid=%d\n",msgid);
system("ipcs -q");
sendbuf.type=100;
//write message queue
while(1)
{
memset(sendbuf.voltage,0,124);//clear send buffer
printf("please input message:\n");
fgets(sendbuf.voltage,124,stdin);
//start write message to message queue
msgsnd(msgid,(void *)&sendbuf,strlen(sendbuf.voltage),0);
}
msgctl(msgid,IPC_RMID,NULL);
system("ipcs -q");
return 0;
}
执行结果:
alex@alex-VirtualBox:~/Share/process/eighteen$ ./write
creat message queue sucess msgid=65537
------ Message Queues --------
key msqid owner perms used-bytes messages
0x00000000 32768 alex 777 0 0
0x61016518 65537 alex 777 0 0
please input message:
hello
please input message:
hi
please input message:
Read.c
#include "sys/types.h"
#include "sys/msg.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct msgbuf
{
long type;
char voltage[124];
char ID[4];
};
int main()
{
int msgid;
int readret;
int key;
struct msgbuf sendbuf,recvbuf;
key=ftok("./b.c",'a');
if(key < 0)
{
printf("creat key failure\n");
return -2;
}
msgid=msgget(key,IPC_CREAT|0777);
if(msgid <0)
{
printf("creat message queue failure\n");
return -1;
}
printf("creat message queue sucess msgid=%d\n",msgid);
system("ipcs -q");
//read message queue
while(1)
{
memset(recvbuf.voltage,0,124);//clear receive buffer
//start read message from message queue
msgrcv(msgid,(void *)&recvbuf,124,100,0);
printf("receive data from message queue:%s",recvbuf.voltage);
}
msgctl(msgid,IPC_RMID,NULL);
system("ipcs -q");
return 0;
}
执行结果:
alex@alex-VirtualBox:~/Share/process/eighteen$ ./read
creat message queue sucess msgid=65537
------ Message Queues --------
key msqid owner perms used-bytes messages
0x00000000 32768 alex 777 0 0
0x61016518 65537 alex 777 0 0
receive data from message queue:hello
receive data from message queue:hi
3. 示例二,双向通信,类似于聊天工具
Server.c
#include "sys/types.h"
#include "sys/msg.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct msgbuf
{
long type;
char voltage[124];
char ID[4];
};
int main()
{
int msgid;
int readret;
int key;
int pid;
struct msgbuf sendbuf,recvbuf;
key=ftok("./a.c",'a');
if(key < 0)
{
printf("creat key failure\n");
return -2;
}
msgid=msgget(key,IPC_CREAT|0777);
if(msgid <0)
{
printf("creat message queue failure\n");
return -1;
}
printf("creat message queue sucess msgid=%d\n",msgid);
system("ipcs -q");
pid=fork();
if(pid > 0) //parent process write 100
{
sendbuf.type=100;
//write message queue
while(1)
{
memset(sendbuf.voltage,0,124);//clear send buffer
printf("please input message:\n");
fgets(sendbuf.voltage,124,stdin);
//start write message to message queue
msgsnd(msgid,(void *)&sendbuf,strlen(sendbuf.voltage),0);
}
}
if(pid == 0)//child process read 200
{
while(1)
{
memset(recvbuf.voltage,0,124);
msgrcv(msgid,(void *)&recvbuf,124,200,0);
printf("receive message from message queue:%s",recvbuf.voltage);
}
}
msgctl(msgid,IPC_RMID,NULL);
system("ipcs -q");
return 0;
}
执行结果:
alex@alex-VirtualBox:~/Share/process/eighteen$ ./server
creat message queue sucess msgid=65537
------ Message Queues --------
key msqid owner perms used-bytes messages
0x00000000 32768 alex 777 0 0
0x61016518 65537 alex 777 0 0
please input message:
receive message from message queue:hello
hi
please input message:
receive message from message queue:who are you
...
please input message:
Client.c
#include "sys/types.h"
#include "sys/msg.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct msgbuf
{
long type;
char voltage[124];
char ID[4];
};
int main()
{
int msgid;
int readret;
int key;
int pid;
struct msgbuf sendbuf,recvbuf;
key=ftok("./a.c",'a');
if(key < 0)
{
printf("creat key failure\n");
return -2;
}
msgid=msgget(key,IPC_CREAT|0777);
if(msgid <0)
{
printf("creat message queue failure\n");
return -1;
}
printf("creat message queue sucess msgid=%d\n",msgid);
system("ipcs -q");
pid=fork();
if(pid == 0) //child process write 200
{
sendbuf.type=200;
//write message queue
while(1)
{
memset(sendbuf.voltage,0,124);//clear send buffer
printf("please input message:\n");
fgets(sendbuf.voltage,124,stdin);
//start write message to message queue
msgsnd(msgid,(void *)&sendbuf,strlen(sendbuf.voltage),0);
}
}
if(pid > 0)//parent process read 100
{
while(1)
{
memset(recvbuf.voltage,0,124);
msgrcv(msgid,(void *)&recvbuf,124,100,0);
printf("receive message from message queue:%s",recvbuf.voltage);
}
}
msgctl(msgid,IPC_RMID,NULL);
system("ipcs -q");
return 0;
}
执行结果:
alex@alex-VirtualBox:~/Share/process/eighteen$ ./client
creat message queue sucess msgid=65537
------ Message Queues --------
key msqid owner perms used-bytes messages
0x00000000 32768 alex 777 0 0
0x61016518 65537 alex 777 0 0
please input message:
hello
please input message:
receive message from message queue:hi
who are you
please input message:
receive message from message queue:...