- 论坛徽章:
- 0
|
我仔细看了代码,分析一下。见程序中的注释。
- #include <unistd.h>
- #include <sys/types.h>
- #include <errno.h>
- #include <limits.h>
-
- int main()
- {
- int pipe_fd[2];
- pid_t pid;
- char r_buf[4096];
- char w_buf[4096*2];
- int writenum;
- int rnum=1;
- memset(r_buf,0,sizeof(r_buf));
- if(pipe(pipe_fd)<0)
- {
- printf("pipe error\n");
- return -1;
- }
- if((pid=fork())==0)//进入子进程
- {
- close(pipe_fd[1]);//关闭写
- while(rnum!=0)
- {
- sleep(1);
- rnum=read(pipe_fd[0],r_buf,1000);
- printf("child readnum is %d\n",rnum);
- }
- close(pipe_fd[0]);//关闭读
- exit(0);//子进程退出
- }
- else if(pid>0)//父进程
- {
- close(pipe_fd[0]);
- memset(r_buf,0,sizeof(r_buf));
- if((writenum=write(pipe_fd[1],w_buf,1024))==-1)
- printf("write to pipe error\n");
- else
- printf("the bytes write to pipe is %d \n",writenum);
- writenum=write(pipe_fd[1],w_buf,4096);
- close(pipe_fd[1]);
- }
- return 0;
- }
- 运行结果:
- [root@localhost work]# ./demo
- the bytes write to pipe is 1024
- child readnum is 1000
- [root@localhost work]# child readnum is 1000
- child readnum is 1000
- child readnum is 1000 此行为什么说明了写入的非原子性? //这个地方不知道为什么
- child readnum is 1000
- child readnum is 120 此行为什么说明了写入的非原子性? //此地方当然证明了写入的非原子性,因为非原子性表示写入可能不会一次完成,也就是可以阻塞的。这个地方由于PIPI_BUF是4096,所以,你再次写入4096的时候,PIPE已经满了,所以,这个地方要阻塞,等待读PIPE到来,读取之后,才能再往里边写。
- child readnum is 0
复制代码 |
|