当open一个FIFO时,是否设置非阻塞标志(O_NONBLOCK)的区别:
若没有执行O_NONBLOCK(默认),只读open要阻塞到某个其他进程为写而打开此FIFO。类似的,只写open要阻塞到其他进程为读而打开它。
若指定了O_NONBLOCK,则只读open立即返回。而只写open将出错返回-1,如果没有进程已经为读而打开该FIFO,其errno置ENXIO。
read.c文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
// int mkfifo(const char *pathname, mode_t mode);
int main()
{
int nread=0;
char buf[30]={0};
if((mkfifo("./file",0600)==-1)&&errno!=EEXIST){
printf("mkfifo fail\n");
perror("why");
}
int fd=open("./file",O_RDONLY);
printf("open success\n");
while(1){
nread=read(fd,buf,30);
printf("read%dbyte from fifo,context:%s\n",nread,buf);
}
close(fd);
return 0;
}
write.c文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
// int mkfifo(const char *pathname, mode_t mode);
int main()
{
int cnt=0;
char *str="message from fifo";
int fd=open("./file",O_WRONLY);
printf("write open success\n");
while(1){
write(fd,str,strlen(str));
sleep(1);
if(cnt==5){
break;
}
}
close(fd);
return 0;
}
gcc read.c -o read:生成可执行read文件
gcc write.c -o write:生成可执行write文件
./read:运行read
Alt+ctrl+t:重新开个窗口,进入当前read文件夹
./write:运行write
可以看到,write每隔1s往file文件中写入一次数据,read从file中取出数据并打印出来
如果要open不堵塞,则添加O_NONBLOCK
int fd=open("./file",O_RDONLY|O_NONBLOCK);