使用消息队列完成两个进程间的相互通信
#include <myhead.h>
typedef struct
{
long msgtype;
int len;
char mtext[1024];
}ok;
#define size (sizeof(ok)-sizeof(long)-sizeof(int))
int main(int argc, const char *argv[])
{
if(argc!=3)
{
puts("error");
return -1;
}
//创建key
key_t key=ftok("/",'k');
if(key==-1)
{
perror("ftok error");
return -1;
}
//创建消息队列
int msgid=msgget(key,IPC_CREAT|0664);
if(msgid==-1)
{
perror("msgget error");
return -1;
}
//创建进程
pid_t pid=fork();
if(pid==0)
{
ok o;
int rfd=-1;
//读打开外部文件
if((rfd=open(argv[1],O_RDONLY))==-1)
{
perror("open 1 error");
return -1;
}
while(1)
{
//清空正文区
bzero(o.mtext,size);
//赋值10
o.msgtype=10;
int res=read(rfd,o.mtext,size);
//获取res
o.len=res;
//向消息队列里写数据
if(msgsnd(msgid,&o,size,0)==-1)
{
perror("msgsnd error");
return -1;
}
if(res==0)
break;
}
close(rfd);
puts("输入完成");
exit(0);
}
else if(pid>0)
{
ok o;
int wfd=-1;
//读打开外部文件
if((wfd=open(argv[2],O_WRONLY))==-1)
{
perror("open 2 error");
return -1;
}
while(1)
{
//清空正文区
bzero(o.mtext,size);
//获取数据类型为5对应的数据
if(msgrcv(msgid,&o,size,5,0)==-1)
{
perror("msgsnd error");
return -1;
}
if(o.len==0)
break;
//向文件里写数据
write(wfd,o.mtext,strlen(o.mtext));
}
close(wfd);
puts("写入完成");
wait(NULL);
puts("拷贝完成");
}
else
{
perror("frok error");
return -1;
}
return 0;
}