非阻塞IO

这篇具有很好参考价值的文章主要介绍了非阻塞IO。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文分享的是非阻塞IO,其中包括fcntl函数,然后简单代码实现轮询标志输入输出。

fcntl函数

fcntl函数是一个用于控制文件描述符的系统调用,一个文件描述符, 默认都是阻塞IO。它能够实现文件描述符的各种操作,如复制文件描述符、修改文件状态标志、获取文件状态标志等。

函数原型如下:

#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );

参数说明:

  • fd:需要操作的文件描述符;
  • cmd:需要执行的操作命令;
  • arg:命令所需的参数,具体取决于操作命令。

传入的cmd的值不同, 后面追加的参数也不相同,fcntl函数有5种功能:

复制一个现有的描述符(cmd=F_DUPFD):该命令会复制一个文件描述符,并返回复制后的文件描述符。

 
获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD)。

 
获得/设置文件状态标记(cmd=F_GETFL或F_SETFL)::该命令可以获取和修改文件的状态标志,如O_NONBLOCK、O_APPEND等。

 
获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)。

 
获得/设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW)::该命令可以获取和修改文件的共享锁和独占锁。

用第三种功能, 获取/设置文件状态标记, 就可以将一个文件描述符设置为非阻塞。

在非阻塞的情况下读取数据,如果数据没有就绪,系统是以出错的形式返回(但并非出错),因此在次情况下,没有就绪和出错,使用的是相同的方式去标识。可以使用errno来区分,究竟是没有就绪还是出错。如果errno返回11,即EAGEIN==11,表示没有就绪。文章来源地址https://www.toymoban.com/news/detail-465204.html

使用代码简单实现非阻塞

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>


void SetNonBlock(int fd)
{
  int f1 = fcntl(fd,F_GETFL);
  if(f1 < 0)
  {
    perror("fcntl");
    return;
  }

  fcntl(fd,F_SETFL,f1 | O_NONBLOCK);
}
int main()
{
  SetNonBlock(0);
  while(1)
  {
    char buffer[1024];
    ssize_t s = read(0,buffer,sizeof(buffer)-1);
    if(s > 0)
    {
      buffer[s]=0;
      write(1,buffer,strlen(buffer));
      printf("read success, s:%d,errno: %d\n",s,errno);
    }
    else{
        printf("read fail, s:%d,errno: %d\n",s,errno);
    }
    sleep(1);
  }
  return 0;
}

到了这里,关于非阻塞IO的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux驱动】Linux阻塞IO —— 阻塞读取按键状态(等待队列实现)

    上一节获取按键状态时,是在应用层以循环的方式不断读取按键状态,但是我们实际关注的只是当按键被按下时发生的情况,所以大多数时间拿到的状态都是我们不需要的结果。 对此,当按键被释放时,让 read 接口处于阻塞状态,等按键被按下再解除阻塞。 要使用等待队列

    2024年02月02日
    浏览(43)
  • NIO 非阻塞式IO

    Java NIO 基本介绍 Java NIO 全称 Java non-blocking IO ,是指 JDK 提供的新 API 。从 JDK1.4 开始, Java 提供了一系列改进的输入/输出的新特性,被统称为 NIO (即 NewIO ),是同步非阻塞的。 NIO 相关类都被放在 java.nio 包及子包下,并且对原 java.io 包中的很多类进行改写。 NIO 有三大核心

    2024年02月13日
    浏览(39)
  • Java IO:同步阻塞和装饰器模式详解

    大家好,我是chowley, 今天来介绍一下Java IO中的两个重要概念—— 同步阻塞和装饰器模式。 在计算机编程中,同步阻塞(Synchronous Blocking)指的是在进行某个操作时,当前线程会被阻塞(即暂停执行),直到该操作完成才会继续执行。在 Java IO 中,输入输出操作通常是同步阻

    2024年02月21日
    浏览(33)
  • 5.1阻塞和非阻塞、同步和异步 5.2Unix、Linux上的五种IO模型

    典型的一次IO的两个阶段是什么?数据就绪和数据读写 数据就绪:根据IO操作的就绪状态 阻塞 非阻塞 数据读写:根据应用程序和内核的交互方式 同步 异步 陈硕:在处理IO的时候,阻塞和非阻塞都是同步IO,只有使用了特殊的API才是异步IO。 一个典型的网络接口调用,分为两

    2024年02月12日
    浏览(42)
  • select,poll,epoll阻塞IO使用示例介绍

    epoll 打开设备文件或套接字,并确保设备或套接字处于可读或可写状态。 创建一个 epoll 实例,使用 epoll_create 函数创建一个 epoll 文件描述符。 将设备文件或套接字的文件描述符添加到 epoll 实例中,使用 epoll_ctl 函数将设备文件或套接字的文件描述符添加到 epoll 实例中,并设

    2024年02月12日
    浏览(41)
  • Java NIO(Java Non-Blocking IO:非阻塞式IO)(2)

    1.NIO非阻塞网络编程相关的(Selector、SelectionKey、ServerScoketChannel和SocketChannel)关系梳理图: 说明: ①.当客户端连接时,会通过服务器端ServerSocketChannel得到/生成对应的SocketChannel; ②.通过register(Selector sel,int ops)方法将SocketChannel注册到Selector上(一个Selector上可以注册多个SocketChannel); ③

    2024年02月02日
    浏览(49)
  • Linux搭建Web服务器(一)——阻塞与非阻塞、同步与异步、Linux五种IO模型

    目录 0x01 阻塞与非阻塞、同步与异步 阻塞与非阻塞 同步与异步 总结 0x02 Unix、Linux上的五种IO模型 阻塞(blocking) 非阻塞(non-blocking——NIO) IO复用(IO multiplexing) 信号驱动(signal-driven) 异步(asynchronous) 为了理清楚这几个概念,我们可以从 数据就绪 以及 数据读写 层面

    2023年04月10日
    浏览(66)
  • I.MX6ULL_Linux_驱动篇(39) 阻塞和非阻塞IO

    阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式,在编写驱动的时候一定要考虑到阻塞和非阻塞。本章我们就来学习一下阻塞和非阻塞 IO,以及如何在驱动程序中处理阻塞与非阻塞,如何在驱动程序使用等待队列和 poll 机制。 阻塞和非阻塞简介 这里的“IO”

    2024年02月12日
    浏览(41)
  • 1.内核驱动中,驱动注册,阻塞IO,gpio子系统,中断处理的整体结合示例

    /*功能实现 在stm32开发板上实现功能            1.使用阻塞IO读取number变量的值,当number的值改变时打印number的值            2.注册KEY1按键的驱动和LED1的驱动以及对应的设备文件,            3.按键和指示灯设备信息放在同一个设备树的节点中            4.当KEY1按下时

    2024年02月15日
    浏览(39)
  • 传输优化是非谈

    曾倾向于优化异常流的做法竟然最保守,异常是小概率事件,处理它只保障可用性,而不是优化性能,恰恰需要加速大概率的正常流处理,数据中心传输优化投入大量精力在丢包检测和重传上的思路需重估。 为 1% 的可能性而增加的 if 判断,将给 99% 的逻辑增加指令周期,对

    2024年02月07日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包