目录
使用消息队列完成两个进程间相互通信
代码create.c
#include<myhead.h>
int main(int argc, const char *argv[])
{
//1.获取key值
key_t key;
if(-1==(key = ftok("/",'a'))){
perror("ftok error");
return -1;
}
int msgid;
//2.创建消息队列对象
if(-1 == (msgid = msgget(key,IPC_CREAT|0664))){
perror("msgget error");
return -1;
}
printf("msgid = %d\n",msgid);
getchar(); //阻塞
char comd[32];
sprintf(comd,"ipcrm -q %d",msgid);
//printf("%s\n",comd);
//关闭消息队列
system(comd);
return 0;
}
代码ausrpos.c
#include<myhead.h>
typedef struct
{
long msgtype;
char data[512];
}msg_ds;
#define SIZE sizeof(msg_ds)-sizeof(long)
void handler(int signum){
if(signum==SIGCHLD){
raise(SIGKILL);
}
}
int main(int argc, const char *argv[])
{
printf("请输入消息队列的id:");
int msgid;
scanf("%d",&msgid);
getchar();
//创建一个子进程
pid_t pid;
pid = fork();
if(pid<0){
perror("fork error");
return -1;
}else if(pid==0){
while(1){
//确定发送消息的标志位
msg_ds msgatob = {.msgtype = 1};
//printf("请输入消息的内容:");
fgets(msgatob.data,sizeof(msgatob.data),stdin);
msgatob.data[strlen(msgatob.data)-1] = 0;
//向消息队列中写入消息
if(-1==msgsnd(msgid,&msgatob,SIZE,0)){
perror("msgsnd error");
return -1;
}
if(!strcmp(msgatob.data,"quit")){
break;
}
}
exit(EXIT_SUCCESS);
}else{
while(1){
signal(SIGCHLD,handler);
//确定接收消息的标志位
msg_ds msgbtoa = {.msgtype = 2};
//从消息队列中读入消息
if(-1==msgrcv(msgid,&msgbtoa,SIZE,msgbtoa.msgtype,0)){
perror("msgrcv error");
return -1;
}
printf("接收到的信息为:%s\n",msgbtoa.data);
if(!strcmp(msgbtoa.data,"quit")){
kill(pid,SIGKILL);
break;
}
}
}
wait(NULL);
return 0;
}
代码busrpos.c
#include<myhead.h>
typedef struct
{
long msgtype;
char data[512];
}msg_ds;
#define SIZE sizeof(msg_ds)-sizeof(long)
void handler(int signum){
if(signum==SIGCHLD){
raise(SIGKILL);
}
}
int main(int argc, const char *argv[])
{
printf("请输入消息队列的id:");
int msgid;
scanf("%d",&msgid);
getchar();
//创建一个子进程
pid_t pid;
pid = fork();
if(pid<0){
perror("fork error");
return -1;
}else if(pid==0){
while(1){
//确定发送消息的标志位
msg_ds msgbtoa = {.msgtype = 2};
//printf("请输入消息的内容:");
fgets(msgbtoa.data,sizeof(msgbtoa.data),stdin);
msgbtoa.data[strlen(msgbtoa.data)-1] = 0;
//向消息队列中写入消息
if(-1==msgsnd(msgid,&msgbtoa,SIZE,0)){
perror("msgsnd error");
return -1;
}
if(!strcmp(msgbtoa.data,"quit")){
break;
}
}
exit(EXIT_SUCCESS);
}else{
while(1){
signal(SIGCHLD,handler);
//确定接收消息的标志位
msg_ds msgatob = {.msgtype = 1};
//从消息队列中读入消息
if(-1==msgrcv(msgid,&msgatob,SIZE,msgatob.msgtype,0)){
perror("msgrcv error");
return -1;
}
printf("接收到的信息为:%s\n",msgatob.data);
if(!strcmp(msgatob.data,"quit")){
kill(pid,SIGKILL);
break;
}
}
}
wait(NULL);
return 0;
}
效果
思维导图