实现AB进程对话。
A进程发送一句话后,B进程接收到打印。然后B进程发送一句话,A进程接收后打印
重复上述步骤。直到AB接收或者发送完quit后,结束AB进程
提示用两根管道
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MSG_EXCEPT 020000
struct msgbuf
{
long mtype; //消息类型,必须大于0
char mtext[128]; //消息内容
};
int main(int argc, const char *argv[])
{
//求key1值
key_t key1 = ftok("/./",1);
if(key1 < 0)
{
perror("ftok1");
return -1;
}
printf("key = %#x\n",key1);
//求k2的值
key_t key2 = ftok("/./",2);
if(key2 < 0)
{
perror("ftok2");
return -1;
}
printf("key = %#x\n",key2);
//通过key值找到对应的消息队列1,若消息队列1不存在,则创建消息队列
int msqid1 = msgget(key1,IPC_CREAT|0777);
if(msqid1 < 0)
{
perror("msgget1");
return -1;
}
printf("msqid1 = %d\n",msqid1);
//通过key2值找到对应的消息队列2,若消息队列2不存在,则创建消息队列2
int msqid2 = msgget(key2,IPC_CREAT|0777);
if(msqid2 < 0)
{
perror("msgget2");
return -1;
}
printf("msqid2 = %d\n",msqid2);
//创建
pid_t cpid = fork();
//打包数据
struct msgbuf snd;
struct msgbuf snd1;
ssize_t res = 0;
ssize_t res1 = 0;
struct msgbuf rcv1;
struct msgbuf rcv;
if(cpid > 0)
{
while(1)
{
//send文件向队列中发送消息
printf("请输入消息类型>>> ");
scanf("%ld",&snd.mtype);
getchar();
if(snd.mtype <= 0)
{
break;
}
printf("请输入消息内容>>> ");
fgets(snd.mtext,sizeof(snd.mtext),stdin);
snd.mtext[strlen(snd.mtext)-1] = '\0';
//将数据打包发送到消息队列
if(msgsnd(msqid1,(void*)&snd,sizeof(snd.mtext),0) < 0)
{
perror("msgsnd1");
return -1;
}
printf("父进程向消息队列1发送消息成功\n");
// system("ipcs -q"); //让代码执行shell指令
//接收子进程向队列发送的消息
res = msgrcv(msqid2,&rcv,sizeof(rcv.mtext),0,0);
if(res < 0)
{
perror("msgrcv2");
break;
}
printf("父进程成功读取到消息队列2消息:res=%ld | mtype=%ld : mtext=%s\n",res,rcv.mtype,rcv.mtext);
}
}
else if(0 == cpid)
{
while(1)
{
//接收子进程向队列发送的消息
res1 = msgrcv(msqid1,&rcv1,sizeof(rcv1.mtext),0,0);
if(res1 < 0)
{
perror("msgrcv1");
break;
}
printf("子进程成功接收到父进程发送到消息队列1消息:res1=%ld | mtype=%ld : mtext=%s\n",res1,rcv1.mtype,rcv1.mtext);
//向父进程发送消息
printf("(子进程)请输入消息类型>>> ");
scanf("%ld",&snd1.mtype);
getchar();
if(snd1.mtype <= 0)
{
break;
}
printf("(子进程)请输入消息内容>>> ");
fgets(snd1.mtext,sizeof(snd1.mtext),stdin);
snd1.mtext[strlen(snd1.mtext)-1] = '\0';
//将数据打包发送到消息队列
if(msgsnd(msqid2,(void*)&snd1,sizeof(snd1.mtext),0) < 0)
{
perror("msgsnd2");
return -1;
}
printf("子进程向消息队列2发送消息成功\n");
system("ipcs -q"); //让代码执行shell指令
}
}
//删除消息对列1
if(msgctl(msqid1,IPC_RMID,NULL))
{
perror("msgctl");
return -1;
}
printf("删除消息队列成功\n");
//删除消息队列2
if(msgctl(msqid1,IPC_RMID,NULL))
{
perror("msgctl");
return -1;
}
system("ipcs -q");
return 0;
}