LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1281|回复: 0

write 一个已经设置O_NONBLOCK的fifo竟然阻塞,何故?

[复制链接]
发表于 2007-3-29 22:09:01 | 显示全部楼层 |阅读模式
首先声明一下环境是CYGWIN:
c文件内容如下

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/stat.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <fcntl.h>
  7. #define S_ALLPERM (S_IRWXU | S_IRWXG | S_IRWXO)
  8. int main()
  9. {
  10.     umask(0);
  11.     char buf[2];
  12.     if (-1 == mkfifo("a_b",O_RDONLY|S_ALLPERM))
  13.     {
  14.         if (EEXIST != errno)
  15.         {
  16.             printf("make fifo failed: %s\n",strerror(errno));
  17.             return -1;
  18.          }
  19.     }

  20.     #ifdef READFIFO
  21.     int fd = open("a_b",O_RDONLY);
  22.     #else
  23.     int fd = open("a_b",O_WRONLY);
  24.     #endif
  25.     if (-1 == fd)
  26.     {
  27.         printf("can not open fifo  :%s\n",strerror(errno));
  28.         return -1;
  29.     }

  30.     //set nonblock
  31.     #ifdef NOWAIT
  32.     if (-1 == fcntl(fd,F_SETFL,fcntl(fd,F_GETFL)|O_NONBLOCK))
  33.     {
  34.         printf("set non block failed: %s\n",strerror(errno));
  35.     }
  36.     #endif
  37.    
  38.     #ifdef READFIFO
  39.     if (-1 == read(fd,buf,2))
  40.     {
  41.         printf("can not read pipe: %s\n",strerror(errno));
  42.         return -1;
  43.     }
  44.     printf("read over\n");
  45.     #else
  46.    
  47.     if (-1 == write(fd,"ab",2))
  48.     {
  49.         printf("can not write pipe: %s",strerror(errno));
  50.         return -1;
  51.     }
  52.     printf("write over\n");
  53.     #endif
  54.     return 0;
  55. }
复制代码


编译方法

  1.   606  gcc -o readfifo -DREADFIFO testfifo.c  -DNOWAIT -g
  2.   607  gcc -o writefifo testfifo.c  -DNOWAIT -g
复制代码


调用readfifo可以马上返回资源不可用,但是writefifo不管是block还是non block都停住.

大家可以自己测一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表