Linux 文件操作中的阻塞和非阻塞操作


//源代码
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>

char buffer[4096];
int main(int argc,char **argv)
{
       int delay = 1, n, m = 0;
      
       if(argc > 1)
       {
             delay = atoi(argv[1]);
             printf("delay = %d seconds\n", delay);
       }
       fcntl(0,F_SETFL,fcntl(0,F_GETFL)|O_NONBLOCK);//stdin
       fcntl(1,F_SETFL,fcntl(1,F_GETFL)|O_NONBLOCK);//stdout
      
       while(1)
       {
             n = read(0,buffer,4096);
             if (n > 0)
             {
                   printf("Got %d byte data.\n", n);
             }
             if (n>0)
                   m = write (1,buffer,n);
             if ((n<0||m<0) && (errno != EAGAIN))
                   break;
             if ((n<0||m<0) && (errno == EAGAIN))
             {
                 perror( n<0 ? "stdin working in NONBLOCK, no data!" : "stdout working in NONBLOCK, no data");
             }
             sleep(delay);
       }
       perror( n<0 ? "stdin" : "stdout");
       exit(1);
}
执行:
[root@localhost nbtest]# ./nbtest 5
delay = 5 seconds
stdin working in NONBLOCK, no data!: Resource temporarily unavailable
12345
Got 6 byte data.
12345
注意,
(1)在标准输入中键入回车后才算是有效输入。
(2)回车也算是输入的一个字符,比如输入12345+回车,实际读入的长度是6个字节。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非阻塞IO是指在进行IO操作时,如果当前没有数据可读或者没有空闲空间可,不会一直等待,而是立即返回一个错误码,让程序可以继续执行其他任务。 在Linux内核,实现非阻塞IO的主要方法是使用异步IO和轮询机制。 异步IO的实现原理是:应用程序通过对文件描述符进行异步IO设置,当异步IO操作完成时,内核会向应用程序发送一个信号,应用程序可以在信号处理函数读取数据或者进行其他操作。 轮询机制的实现原理是:应用程序通过对文件描述符进行设置,将其添加到轮询列表,然后不断地轮询这个列表,检查其文件描述符是否可读或可,如果可读或可,则进行IO操作,否则继续轮询。 非阻塞IO的实现步骤如下: 1. 设置文件描述符为非阻塞模式,可以使用fcntl函数进行设置。 2. 在进行IO操作前,使用select或者poll函数对文件描述符进行轮询或者异步IO设置。 3. 在IO操作返回错误码时,根据错误码进行判断,如果是EAGAIN或者EWOULDBLOCK,则说明当前没有数据可读或者没有空闲空间可,可以进行其他操作;如果是其他错误码,则可能是IO操作出错,需要进行错误处理。 需要注意的是,在使用非阻塞IO时,应用程序需要不断地进行轮询或者异步IO设置,否则可能会出现数据丢失或者延迟等问题。同时,非阻塞IO也会增加CPU的负载,因此需要进行合理的优化和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值