赞
踩
当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);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。