该例子主要是读取两个文件,然后把内容分别放入消息队列,类型分别为1,2
由接受进程根据类型读出
filesend.c
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "user.h"
close_all(int msgid,int fd1,int fd2)
{
close(fd1);
close(fd2);
msgctl(msgid,IPC_RMID,0);
}
main(int argc,char **argv)
{
int fd1,fd2,msgid;
int end1=1,end2=1;
key_t key;
struct msg_data data1,data2;
if(argc!=3)
{
printf("usage:argv[0]file1 file2<CR>\n");
exit(-1);
}
if((fd1=open(argv[1],O_RDONLY))==-1)
{
printf("%s can not opened\n",argv[1]);
exit(-1);
}
if((fd2=open(argv[2],O_RDONLY))==-1)
{
printf("%s can not opened\n",argv[2]);
exit(-1);
}
if((key=ftok("/tmp",'a'))==-1)
{
close(fd1);
close(fd2);
exit(-1);
}
if((msgid=msgget(key,IPC_CREAT|IPC_EXCL|0666))==-1)
{
close(fd1);
close(fd2);
exit(-1);
}
printf("\n send:messages queue created!\n");
data1.type=F_TYPE1;
data2.type=F_TYPE2;
data1.size=read(fd1,data1.buf,BUF_SIZE);
data2.size=read(fd2,data2.buf,BUF_SIZE);
while(data1.size||data2.size)
{
if(data1.size)
{
if(msgsnd(msgid,(struct my_msgbuf*)&data1,sizeof(struct msg_data),0)==-1)
{
printf("send error!\n");
exit(-1);
}
printf("read file1!\n");
data1.size=read(fd1,data1.buf,BUF_SIZE);
}
if(data2.size)
{
if(msgsnd(msgid,(struct my_msgbuf*)&data2,sizeof(struct msg_data),0)==-1)
{
printf("send error!\n");
exit(-1);
}
printf("read file2!\n");
data2.size=read(fd2,data2.buf,BUF_SIZE);
}
}//end while
printf("sender:data transmission to message queue completed!\n");
while(end1 && end2)
{
struct my_msgbuf rec;
if(msgrcv(msgid,&rec,sizeof(struct my_msgbuf),TYPE_END1,IPC_NOWAIT)!=-1)
{
printf("the file1 end!\n");
end1=0;
}
if(msgrcv(msgid,&rec,sizeof(struct my_msgbuf),TYPE_END2,IPC_NOWAIT)!=-1)
{
printf("the file2 end!\n");
end2=0;
}
}
printf("sender:disconnection of the two receiver process!\n");
close_all(msgid,fd1,fd2);
}
filereceive.c
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "user.h"
main(int argc,char **argv)
{
int fd,ret,msgid;
int no;
int type;
key_t key;
struct msg_data data;
struct my_msgbuf dis_msg;
if(argc!=3)
{
printf("usage:argv[0]file1 file2<CR>\n");
exit(-1);
}
no=atoi(argv[1]);
if(no!=1&&no!=2)
{
printf("error!\n");
exit(-1);
}
if(no==1)
{
printf("the no is %d",no);
type=F_TYPE1;
}
else
{
printf("the no is %d\n",no);
type=F_TYPE2;
}
if((key=ftok("/tmp",'a'))==-1)
{
printf("create key failed!\n");
exit(-1);
}
printf("create key success!\n");
if((msgid=msgget(key,IPC_EXCL))==-1)
{
printf("create msgid failed!\n");
exit(-1);
}
if((fd=open(argv[2],O_WRONLY))==-1)
{
printf("can not open file!\n");
}
printf("receive data begin!\n");
while(data.size)
{
if(msgrcv(msgid,(struct my_msgbuf*)&data,sizeof(struct msg_data),type,0)==-1)
{
printf("receive error!\n");
exit(-1);
}
printf("receive data success!\n");
printf("the data size is %d\n",data.size);
if(data.size<=0)
{
printf("the data size is 0\n");
break;
}
ret=write(fd,data.buf,data.size);
printf("the file2 isd %d\n",ret);
if(ret==-1)
{
close(fd);
msgctl(msgid,IPC_RMID,0);
printf("receive!\n");
exit(-1);
}
break;
}
close(fd);
printf("receive:data transmission to message queue completed!\n");
if(no==1)
{
dis_msg.mtype=TYPE_END1;
}
else
{
dis_msg.mtype=TYPE_END2;
}
msgsnd(msgid,&dis_msg,sizeof(struct my_msgbuf),0);
}
user.h文件
#define F_KEY "copyfile"
#define F_TYPE1 1
#define F_TYPE2 2
#define TYPE_END1 3
#define TYPE_END2 4
#define BUF_SIZE 256
struct msg_data
{
long type;
int size;
char buf[BUF_SIZE];
};
struct my_msgbuf
{
long int mtype;
char mtex[256];
};
编译运行:
gcc -o send filesend.c
gcc -o recv filereceive.c
./send dbfile1 dbfile2
./recv 1 file1
./recv 2 file2