|
发表于 2005-3-17 08:31:09
|
显示全部楼层
- extern int errno;
- long arg;
- ssize_t ret;
- /* 将用来读管道的 fd 设为非阻塞 */
- arg = fcntl(fd, F_GETFL);
- arg |= O_NONBLOCK;
- fcntl(fd, F_SETFL, arg);
- /* 读管道 */
- ret = read(fd, buf, size);
- if (0 == ret) {
- /* 管道已经被关闭 */
- }
- else if (ret > 0) {
- /* 已经读出来了 */
- }
- else if (-1 == ret && EAGAIN == errno) {
- /* 管道里没有可读的内容 */
- }
- else {
- /* 别的错误 */
- }
- /* 恢复 fd 原来的属性 */
- /* ... (略) */
复制代码
这段程序俺没试过,仅供参考。
如果你希望一直用非阻塞方式,在 open 的时候就加上 O_NONBLOCK 属性,就不需要用 fcntl。
或者你可以用 select 检测是否可读,参考 man select. |
|