#include "common.h" //write void main() { int fp; int shmid; //share memory id char *shmaddr; //share memory address int mid; //message id struct message msg; //open file fp = open(filePath2, O_RDWR | O_CREAT, 0777); if (-1 == fp) { printf("%s open error!\n", filePath2); exit(1); } //init share memory shmid = shmget(SHMKEY, BUF_SIZE, 0777 | IPC_CREAT); if (shmid<0) { printf("shmget error!\n"); close(fp); exit(1); } //reflect share memory shmaddr = shmat(shmid, 0, 0); if (shmaddr<(char*)0) { printf("shmat error!\n"); close(fp); exit(1); } //init message queue mid = msgget(MSGKEY, IPC_CREAT | 0666); if (mid<0) { printf("msgget error!\n"); close(fp); shmdt(shmaddr); } //file transfer while (1) { //receive msg from read memset(&msg, 0, sizeof(msg)); msgrcv(mid, &msg, sizeof(msg) - sizeof(msg.msg_type), MESSAGE_TYPE_READ, 0); //read close shmaddr,the msg_text will be null,the process will be break; if (0 != strcmp(msg.msg_text, content[1])) { printf("over\n"); break; } //write to filePath2 from shmaddr write(fp, shmaddr, msg.msg_len); //send to read msg memset(&msg, 0, sizeof(msg)); msg.msg_type = MESSAGE_TYPE_WRITE; strcpy(msg.msg_text, content[0]); msgsnd(mid, &msg, sizeof(msg) - sizeof(msg.msg_type), 0); } close(fp); shmdt(shmaddr); msgctl(mid, IPC_RMID, NULL); }
#ifndef _COMMON_H_ #define _COMMON_H_ #include <sys/types.h> #include <sys/stat.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/msg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> //定义了两个固定的KEY #define SHMKEY 170811 #define MSGKEY 170810 #define BUF_SIZE 1024 #define MIN_STRING 32 //运行程序前在目录/tmp下准备了pic.jpg文件 const char filePath1[] = { "/tmp/pic.jpg" }; const char filePath2[] = { "/tmp/bic.jpg" }; struct message { long msg_type; char msg_text[MIN_STRING]; int msg_len; }; enum messageType { MESSAGE_TYPE_READ = 1, MESSAGE_TYPE_WRITE, MESSAGE_TYPE_MAX, }; const char content[][MIN_STRING] = { "read done", "write done", }; #endif // !_COMMON_H_
#include "common.h" //read void main() { int fp; int shmid; //share memory id char *shmaddr; //share memory address int readsize; int mid; //message id struct message msg; //open file fp = open(filePath1, O_RDONLY, 0777); if (-1 == fp) { printf("%s open error!\n", filePath1); exit(1); } //init share memory shmid = shmget(SHMKEY, BUF_SIZE, 0777 | IPC_CREAT); if (shmid<0) { printf("shmget error!\n"); close(fp); exit(1); } //reflect share memory shmaddr = shmat(shmid, 0, 0); if (shmaddr<(char*)0) { printf("shmat error!\n"); close(fp); exit(1); } //init message queue mid = msgget(MSGKEY, IPC_CREAT | 0666); if (mid<0) { printf("msgget error!\n"); close(fp); shmdt(shmaddr); } //file transfer while (1) { //read file to share memory readsize = read(fp, shmaddr, BUF_SIZE); //send to write programe,data is ready,can be read memset(&msg, 0, sizeof(msg)); msg.msg_type = MESSAGE_TYPE_READ; msg.msg_len = readsize; strcpy(msg.msg_text, content[1]); msgsnd(mid, &msg, sizeof(msg) - sizeof(msg.msg_type), 0); //receive massage from write programe,can be write memset(&msg, 0, sizeof(msg)); msgrcv(mid, &msg, sizeof(msg) - sizeof(msg.msg_type), MESSAGE_TYPE_WRITE, 0); if (0 != strcmp(msg.msg_text,content[0])) { printf("system error"); break; } //the file was read empty if (readsize<BUF_SIZE) { break; } } close(fp); shmdt(shmaddr); msgctl(mid, IPC_RMID, NULL); }