IPC 有命管道
创建一个有名管道 /tmp/stduent.data A 和 B 是 相对独立的两支程序,现在 A 传送 10 个Student 到 BB 将Student 读取出来,显示在界面上
然后 B 传送 10 个 Teacher 到 A ,A 显示 teacher 在界面上
A.cpp
#include "public.h"
#define FIFO_NAME "/temp/Linux/my_fifo"
#define BUFFER_SIZE PIPE_BUF#define TEN_MEG (1024*1024*10)typedef struct students
{ int no; char username[100];}*StuNode,SNode;
int main()
{int pipe_fd;
int ret; int open_mode=O_WRONLY; int bytes=0; char buffer[BUFFER_SIZE+1]; SNode stus[10]; for (int i=0;i<10;i++) { stus[i].no=i+1; strcpy(stus[i].username,"student"); } if (access(FIFO_NAME,F_OK)==-1) { ret=mkfifo(FIFO_NAME,0777); if (ret!=0) { fprintf(stderr,"Could not create fifo %s\n",FIFO_NAME); exit(EXIT_FAILURE); } } printf("Process %d opening FIFO O_WRONLY\n",getpid()); pipe_fd=open(FIFO_NAME,open_mode); printf("Process %d result %d\n",getpid(),pipe_fd); if (pipe_fd!=-1) { while (bytes<10) { ret=write(pipe_fd,&stus[bytes],sizeof(SNode)); if (ret==-1) { fprintf(stderr,"write error on pipe\n"); exit(EXIT_FAILURE); } bytes++; } close(pipe_fd); } else { exit(EXIT_FAILURE);}
printf("Process %d finish \n",getpid()); exit(EXIT_FAILURE); return 0;}
B.cpp
#include "public.h"
#define FIFO_NAME "/temp/Linux/my_fifo"
#define BUFFER_SZIE PIPE_BUFtypedef struct students{ int no; char username[100];}*StuNode,SNode;int main(){ int pipe_fd; int ret; int open_mode=O_RDONLY; char buffer[BUFFER_SZIE+1]; int bytes=0; SNode stus[10]; memset(buffer,'\0',sizeof(buffer)); printf("Process %d opening FIFO O_RDONLY\n",getpid()); pipe_fd=open(FIFO_NAME,open_mode); if (pipe_fd!=-1) { do { ret=read(pipe_fd,&stus[bytes],sizeof(SNode)); printf("no = %d username = %s \n",stus[bytes].no,stus[bytes].username); bytes++; } while (ret>0); close(pipe_fd); } else exit(EXIT_FAILURE); printf("Process %d finished,%d bytes read\n",getpid(),bytes); exit(EXIT_FAILURE); return 0;}