LinuxSir.cn,穿越时空的Linuxsir!

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

命名管道的读取端能不能判断是不是为空?

[复制链接]
发表于 2005-3-16 13:27:02 | 显示全部楼层 |阅读模式
怎么在读取端判断管道里的东西是不是空?是不是 都读过?
发表于 2005-3-16 14:42:09 | 显示全部楼层
非阻塞读,检查返回值?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-16 15:24:26 | 显示全部楼层
具体点?谢谢
回复 支持 反对

使用道具 举报

发表于 2005-3-17 08:31:09 | 显示全部楼层

  1.     extern int errno;
  2.     long arg;
  3.     ssize_t ret;

  4.     /* 将用来读管道的 fd 设为非阻塞 */
  5.     arg = fcntl(fd, F_GETFL);
  6.     arg |= O_NONBLOCK;
  7.     fcntl(fd, F_SETFL, arg);

  8.     /* 读管道 */
  9.     ret = read(fd, buf, size);
  10.     if (0 == ret) {
  11.         /* 管道已经被关闭 */
  12.     }
  13.     else if (ret > 0) {
  14.         /* 已经读出来了 */
  15.     }
  16.     else if (-1 == ret && EAGAIN == errno) {
  17.         /* 管道里没有可读的内容 */
  18.     }
  19.     else {
  20.         /* 别的错误 */
  21.     }

  22.     /* 恢复 fd 原来的属性 */
  23.     /* ... (略) */
复制代码

这段程序俺没试过,仅供参考。
如果你希望一直用非阻塞方式,在 open 的时候就加上 O_NONBLOCK 属性,就不需要用 fcntl。
或者你可以用 select 检测是否可读,参考 man select.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-17 22:13:38 | 显示全部楼层
非常感谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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