Linux作業系統之PIPE_BUF——父程序讀出資料不相互交叉的問題
阿新 • • 發佈:2018-12-16
問題描述:
- 常量PIPE_BUF(在limits.h中定義)規定了核心的管道緩衝區大小,為4096byte。
- 父程序建立的3個子程序同時寫一個管道,要求寫入的位元組數超過PIPE_BUF,父程序從管道讀出的子程序寫入的資料不能相互交叉。
程式碼如下:
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <string.h> #define MAXLINE 4096 int main(void) { int n; int i; int fd[2]; pid_t pid1,pid2,pid3; char line[40960]; pipe(fd); char a[4096]; while( (pid1=fork()) == -1);/*child1*/ if (pid1 > 0) { while((pid2=fork()) == -1);/*child2*/ if(pid2 == 0) { for( i=0;i<40960;i++) { line[i]='2'; } lockf(fd[1],1,0); close(fd[0]); write(fd[1], line, 40960); //wait(NULL); lockf(fd[1],0,0); } if(pid2 > 0) { while((pid3=fork()) == -1); if(pid3>0) { /*close(fd[1]); n = read(fd[0], line, MAXLINE); write(STDOUT_FILENO, line, n);*/ } else if(pid3==0) { for( i=0;i<40960;i++) { line[i]='3'; } lockf(fd[1],1,0); close(fd[0]); write(fd[1], line, 40960); //wait(NULL); lockf(fd[1],0,0); } close(fd[1]); while(1){ n = read(fd[0], a, MAXLINE); if(n<=0) break; printf("%c\n", a[0]); //printf("%d\n",strlen(a)); } //write(STDOUT_FILENO, a, 40960*3); } /*close(fd[1]); n = read(fd[0], line, MAXLINE); write(STDOUT_FILENO, line, n); */ } else if (pid1 == 0) { for( i=0;i<40960;i++) { line[i]='1'; } lockf(fd[1],1,0); close(fd[0]); write(fd[1], line, 40960); //wait(NULL); lockf(fd[1],0,0); } return 0; }