//命名管道的打开操作像普通文件的读写操作,可以使用系统的函数调用open()
//或者fopen()来打开文件,读写的操作也像对普通文件的操作一样。 //1.对于读写,命名管道不能再打开时同时用于读和写,打开管道时必须只能选择一种打开模式,知道关闭管道为止 //2.管道的读写是阻塞的,当进程读命名管道而管道内无数据时,读的进程被阻塞,它不会接收到EOF,当进程向管道 //中写数据,但是读入端时(比如管道的进程已经关闭了命名管道),写的进程被阻塞,知道有进程重新打开管道为止 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <fcntl.h> #include <limits.h> #include <sys/types.h> #include <sys/stat.h>#define FIFO_NAME "/tmp/myfile"
#define BUFFER_SIZE PIPE_BUF #define TEN_MEG (1024*1024*10)int main(int argc,char *argv[])
{ int pipe_fd; int res; int open_mode = O_WRONLY; int bytes_sent = 0; char buffer[BUFFER_SIZE+1]; //判断FIFO是否存在,如果不存在则建立 if(access(FIFO_NAME,F_OK)==-1){ res= mkfifo(FIFO_NAME,0777); if(res!=0){ fprintf(stderr,"Could not create fifo %s\n",FIFO_NAME); exit(1); } } //打开fifo 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_sent<TEN_MEG){ res= write(pipe_fd,buffer,BUFFER_SIZE); if(res==-1){ fprintf(stderr,"Write error on pipe\n"); exit(1); } bytes_sent++=res; } close(pipe_fd); }else{ exit(1); } printf("Process %d finished\n",getpid()); return 0;}