Unix高级IO之非阻塞I/O

定义


非阻塞I/O使我们可以调用open、read、write等I/O操作,并使这些操作不会永远阻塞。如果这种操作不能完成,则调用立即出错返回,表示该操作如继续执行将会阻塞。

方法


对于一个给定的描述符指定非阻塞I/O:

1,如果调用open获得描述符,则可指定O_NONBLOCK标志

2,对于已经打开的一个描述符,则可以调用fcntl,由该函数打开O_NONBLOCK文件状态标志。

示例


  
  
  1. #include "apue.h"
  2. #include <errno.h>
  3. #include <fcntl.h>
  4. char buf[500000];
  5. int main(void)
  6. {
  7.    int ntowrite,nwrite;
  8.    char *ptr;
  9.    set_fl(STDOUT_FILENO, O_NONEBLOCK);
  10.    
  11.    ptr = buf;
  12.    while(ntowrite > 0)
  13.    {
  14.        errno = 0;
  15.        nwrite = write(STDOUT_FILENO, ptr, ntowrite);
  16.        fprintf(stderr, "nwrite = %d, errno= %d\n", nwrite, errno);
  17.        if(nwrite > 0)
  18.        {
  19.             prt += nwrite;
  20.             ntowrite -= nwrite;
  21.         }
  22.    }
  23.    clr_fl(STDOUT_FILENO, O_NONEBLOCK);
  24.    exit(0);
  25. }
  26. void set_fl(int fd, int flags)
  27. {
  28.    int val;
  29.    if((val=fcntl(fd, F_GETFL, 0)) < 0)
  30.        err_sys("fcntl F_GETFL error");
  31.    val |= flags;
  32.    if(fcntl(fd, F_SETFL, val) < 0)
  33.        err_sys("fcnlt SETFL error");
  34. }
  35. void clr_fl(int fd, int flags)
  36. {
  37.    int val;
  38.    if((val=fcntl(fd, F_GETFL, 0)) < 0)
  39.        err_sys("fcntl F_GETFL error");
  40.    val |= ~flags;
  41.    if(fcntl(fd, F_SETFL, val) < 0)
  42.        err_sys("fcnlt SETFL error");
  43. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值