const char *fifo_name = "/tmp/my_fifo"; int pipe_fd = -1; int data_fd = -1; int res = 0; const int open_mode = O_WRONLY; int bytes_sent = 0; char buffer[PIPE_BUF + 1]; 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(EXIT_FAILURE); } } printf("Process %d opening FIFO O_WRONLY\n", getpid()); //以只寫阻塞方式打開FIFO文件,以只讀方式打開數據文件 pipe_fd = open(fifo_name, open_mode); data_fd = open("Data.txt", O_RDONLY); printf("Process %d result %d\n", getpid(), pipe_fd); if(pipe_fd != -1) { int bytes_read = 0; //向數據文件讀取數據 bytes_read = read(data_fd, buffer, PIPE_BUF); buffer[bytes_read] = '\0'; // while(bytes_read > 0) // { //向FIFO文件寫數據 //res = write(pipe_fd, buffer, bytes_read); res = write(pipe_fd, argv[1],strlen(argv[1])); if(res == -1) { fprintf(stderr, "Write error on pipe\n"); exit(EXIT_FAILURE); } //累加寫的字節數,並繼續讀取數據 bytes_sent += res; bytes_read = read(data_fd, buffer, PIPE_BUF); buffer[bytes_read] = '\0'; // } close(pipe_fd); close(data_fd); } else exit(EXIT_FAILURE); printf("Process %d finished\n", getpid()); exit(EXIT_SUCCESS);
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <limits.h> #include <string.h> int main() { const char *fifo_name = "/tmp/my_fifo"; int pipe_fd = -1; int data_fd = -1; int res = 0; int open_mode = O_RDONLY; char buffer[PIPE_BUF + 1]; int bytes_read = 0; int bytes_write = 0; //清空緩衝數組 memset(buffer, '\0', sizeof(buffer)); printf("Process %d opening FIFO O_RDONLY\n", getpid()); //以只讀阻塞方式打開管道文件,注意與fifowrite.c文件中的FIFO同名 //以只寫方式建立保存數據的文件 data_fd = open("DataFormFIFO.txt", O_WRONLY|O_CREAT, 0644); //if(pipe_fd != -1) //{ //int count =10; while(1){ //do // { pipe_fd = open(fifo_name, open_mode); if(pipe_fd){ printf("Process %d result %d\n",getpid(), pipe_fd); //讀取FIFO中的數據,並把它保存在文件DataFormFIFO.txt文件中 res = read(pipe_fd, buffer, PIPE_BUF); if(res>0) { printf("%s\n",buffer); memset(buffer, '\0', sizeof(buffer)); close(pipe_fd); } } else{ printf("read %d ",res); usleep(500); } ///bytes_write = write(data_fd, buffer, res); // bytes_read += res; // }while(res>0); //count--; } close(pipe_fd); close(data_fd); //} // else // exit(EXIT_FAILURE); printf("Process %d finished, %d bytes read\n", getpid(), bytes_read); exit(EXIT_SUCCESS); }