1 read读管道,如果管道中没有数据,read默认是带阻塞的
可以设置管道的读端的文件描述符为非阻塞
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
//创建管道
int fd[2];
//fd[0] 保存管道读端文件描述符
//fd[1] 保存管道写端文件描述符
int ret = pipe(fd);
if(ret < 0)
perror("");
pid_t pid = fork();
if(pid < 0)
perror("");
else if( 0 == pid)
{
char buf[16]="";
int i=0;
while(1)
{
memset(buf,'a'+i,sizeof(buf)-1);
i++;
sleep(1);
write(fd[1],buf,strlen(buf));
}
}
else
{
char buf[16]="";
//设置fd[0]为非阻塞
int flag = fcntl(fd[0],F_GETFL);
flag |= O_NONBLOCK;
fcntl(fd[0],F_SETFL,flag);
while(1)
{
usleep(200*1000);
memset(buf,0x00,sizeof(buf));
//fd[0]文件描述符默认是带阻塞的
read(fd[0],buf,sizeof(buf));//管道也是一个特殊的文件,默认是带阻塞的
printf("read data =%s\n",buf);
}
}
return 0;
}
2 向管道中写数据,如果管道的缓冲区满了,write也会阻塞
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, c