问题描述:
- 常量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;
}