#include "apue.h"
//无名管道的读阻塞
main(){
int fd[2];
int ret;
//初始化管道
ret=pipe(fd);
if(ret<0){
printf("fail to create pipe\n");
return -1;
}
printf("success to create pipe ret=%d fd[0]=%d fd[1]=%d\n",ret,fd[0],fd[1]);
char writebuf[128] = "hello nihao";
char readbuf[128];
//向管道写数据
write(fd[1],writebuf,sizeof(writebuf));
//向管道读数据
read(fd[0],readbuf,sizeof(readbuf));
printf("data of reading is buf=%s \n",readbuf);
//清除数组保存的数据
memset(readbuf,0,sizeof(readbuf));
printf("after data was clear buf=%s \n",readbuf);
//第二次从管道读取数据
read(fd[0],readbuf,sizeof(readbuf));//此时处于阻塞状态 查看进程为S状态 睡眠状态
printf("at second data of reading is buf=%s \n",readbuf);
close(fd[0]);
close(fd[1]);
return 0;
}
#include "apue.h"
//无名管道的写阻塞
main(){
int fd[2];
int ret;
//初始化管道
ret=pipe(fd);
if(ret<0){
printf("fail to create pipe\n");
return -1;
}
printf("success to create pipe ret=%d fd[0]=%d fd[1]=%d\n",ret,fd[0],fd[1]);
char writebuf[128] = "hellonihao";
char readbuf[128];
int max=0;
int tem=0;
//循环写数据 输出最大的写缓存是多少 65536
while(1){
//当写满缓存后开始阻塞
tem = write(fd[1],writebuf,sizeof(writebuf));
max = max+tem;
printf("max writting buffer size is %d \n",max);
}
close(fd[0]);
close(fd[1]);
return 0;
}
#include "apue.h"
//无名管道的进程通信
main(){
int fd[2];
int ret;
//初始化管道
ret=pipe(fd);
if(ret<0){
printf("fail to create pipe\n");
return -1;
}
printf("success to create pipe ret=%d fd[0]=%d fd[1]=%d\n",ret,fd[0],fd[1]);
pid_t pid;
pid = fork();
if(pid==0){//子进程
sleep(5);
char readbuf[128];
//睡眠5秒后 等父进程关闭管道 然后向管道读数据 可以正常读取
read(fd[0],readbuf,sizeof(readbuf));
printf("between two processes data of reading is buf=%s \n",readbuf);
}
if(pid>0){//父进程
char writebuf[128] = "hello nihao";
//向管道写数据
write(fd[1],writebuf,sizeof(writebuf));
}
close(fd[0]);
close(fd[1]);
printf(" close pipe's proces is %d \n",pid);
return 0;
}