首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux编程(阻塞和非阻塞IO)

Linux设备驱动中的阻塞和非阻塞I/0,简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式。...非阻塞应用程序通常使用select系统调用查询是否可以对设备进行无阻塞的访问最终会引发设备驱动中 poll 函数执行。...=1); //串口上没有输入则返回,所以循环读取 printf("%c/n",buf); 阻塞操作常常用等待队列来实现,而非阻塞操作用轮询的方式来实现。...非阻塞I/O的操作在应用层通常会用到select()和poll()系统调用查询是否可对设备进行无阻塞访问。select()和poll()系统调用最终会引发设备驱动中的poll()函数被调用。...exceptionfds, struct timeval *timeout); numfds 的值为需要检查的号码最高的文件描述符加1,若select()在等待timeout时间

5.5K20

linux阻塞与非阻塞(connect连接超时)

阻塞connect详情介绍可以参见文章:https://blog.csdn.net/qq_41453285/article/details/89890429 一、非阻塞connect概述 man手册...只是当前连接还没有建立完整),所以我们可以在通过给select、pol或epoll设置等待时间,来等待这个connect的连接成功,从而进一步处理 如果非阻塞connect返回的错误不是EINPROGRESS...,代表就是connect系统调用本身出错了,那么就可以做一些相应的错误处理了 ③当非阻塞connect以EINPROGRESS错误返回之后,我们可以给select、pol或epoll设置等待时间,并将客户端封装在等待可写的结构中...,进一步来等待非阻塞connect客户端与服务端建立完整地连接,在等待的过程中,如果非阻塞connect建立成功了,客户端的sock_fd就会变成可写的(这个在本人的IO复用文章中介绍过,见下图) ④当非阻塞...在有些系统(比如Linux)上返回-1,而在有些系统上(比如源自伯克利的UNIX)返回0 这些问题没有一个统一的解决办法 三、编码演示案例 #include #include <stdlib.h

6.2K10
您找到你想要的搜索结果了吗?
是的
没有找到

阻塞阻塞读写总结、tcp网络编程的本质、muduo::Buffer设计简介

3、阻塞模式下可以用setsockopt设置SO_RCVTIMEO(超时时间),即如果在超时时间内接收缓冲区都没有一点数据到来,那么返回-1,errno = EAGAIN | EWOULDBLOCK 错误...4、recv的第四个参数若为MSG_WAITALL,则在阻塞模式下不等到指定数目的数据不会返回,除非超时时间到。当然如果对方关闭了,即使超时时间未到,recv 也返回0。.../usr/include/i386-linux-gnu/bits/socket.h     MSG_WAITALL = 0x100 5、在多线程环境中,某个线程的阻塞不会引起进程的阻塞,除非进程中的所有线程都被阻塞...(pthread) 二、TCP网络编程的本质 TCP网络编程最本质是的处理三个半事件(来自:muduo manual.pdf) 1....参考: 《UNP》 muduo manual.pdf 《linux 多线程服务器编程:使用muduo c++网络库》

3.2K20

TCP发送缓存阻塞(Send-Q不为0)问题

打开OSD和MS的日志发现消息并没有阻塞在软件层,而是软件层已经将调用了sendmsg系统调用往外发,但是对端还是没有收到消息。...常见的TCP发送端send-Q不减少都是因为接收端接收缓存满了给发送端回复win=0的反压报文,发送端不再给接收端发送报文导致send-Q不减少,但是通过接收端的tcpinfo信息来看,接收端的接收缓存为空...调整发送缓存大小: 最初怀疑是不是跟服务器的tcp读写缓存相关,但是服务器配置的最大的发送缓存和接收缓存都已经非常大,按理说也不会有影响。...,这其实是一个问题,不管TCP大小修改为多小,最多就是消息发送缓慢,而不是卡住不发送,改小了发送缓存后,抓包分析。...结论: 疯狂google后发现有人遇到了类似的问题,原来是tcp的bug, 内核修复了后该问题不再出现。

6.1K20

Linux编程(阻塞的概念)

阻塞。 好吧,再来一点营养。阻塞是啥意思呢? 就是水管堵住了!扭开水龙头没有水出来。...这个道理跟Linux下读取慢速设备(主要指管道和套接字)数据的情形非常相似,例如当我们在读取一个管道时,如果管道里面没有数据,那么我们什么都读不出来,于是就进入了所谓的“阻塞”状态了,说白了阻塞就是使得当前进程或者线程睡眠了的意思...那么再进一步,什么时候会阻塞呢?下面的表格简单描述了这些清空: ? 其中,读者指的是对管道文件拥有读权限的进程或线程(注意不是正在读),写者指的是对管道文件拥有写权限的进程或线程(注意不是正在写)。...除此之外,其实open()函数也会发生阻塞,比如用只读或者只写open一个管道文件的时候。因为一根只有出口或者只有入口的水管,是无法使用的呀!其实就是生活常识。嘿嘿!

2.1K30

linux源码看socket的阻塞和非阻塞

linux源码看socket的阻塞和非阻塞 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。 大部分高性能网络框架采用的是非阻塞模式。...笔者这次就从linux源码的角度来阐述socket阻塞(block)和非阻塞(non_block)的区别。 本文源码均来自采用Linux-2.6.24内核版本。...一个TCP阻塞client端简单的例子 如果我们要产生一个非阻塞的socket,在C语言中如下代码所示: // 创建socket int sock_fd = socket(AF_INET, SOCK_STREAM...的读 .recvmsg = tcp_recvmsg, ...... } fcntl控制socket的阻塞\非阻塞状态 我们用fcntl修改socket的阻塞\非阻塞状态。...阻塞后什么时候恢复运行呢 情况1:有对应的网络数据到来 首先我们看下网络分组到来的内核路径,网卡发起中断后调用netif_rx将事件挂入CPU的等待队列,并唤起软中断(soft_irq),再通过linux

3.5K20

Linux网络编程TCP

TCP/IP协议 TCP/IP 协议栈是一系列网络协议(protocol)的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。...OSI 7层模型和TCP/IP四层网络模型对应关系 计算机网路基础的知识不过多讲解,主要是让大家明白接下来的Linux网络编程数据流属于那一层,具体如下图 TCP/IP协议数据流示意图 我们接下来讲解的...Linux网络编程Tcp协议是属于传输层的协议 Linux Socket 网络编程 TCP协议 TCP是面向连接的可靠的传输层协议。...TCP编程 Linux中的网络编程是通过socket接口来进行的。socket是一种特殊的I/O接口,它也是一种文件描述符。常用于不同机器上的进程之间的通信,当然也可以实现本地机器上的进程之间通信。...\n"); /*清空缓冲区,阻塞等待读取客户端发过来的数据*/ memset(buff,'\0',sizeof(buff)); if(-1 == read(connect_fd,buff

5.4K30

Linux TCP RST情况

其中复位标志RST的作用就是“复位相应的TCP连接”。 TCP连接和释放时还有许多细节,比如半连接状态、半关闭状态等。详情请参考这方面的巨著《TCP/IP详解》和《UNIX网络编程》。...原因在于Socket.close()方法的语义和TCP的“FIN”标志语义不一样:发送TCP的“FIN”标志表示我不再发送数据了,而Socket.close()表示我不在发送也不接受数据了。...; 客户端和服务器统一使用TCP短连接。...使用长连接可以避免每次建立TCP连接的三次握手而节约一定的时间,但是我这边由于是内网,客户端和服务器的3次握手很快,大约只需1ms。...负载等设备 负载设备需要维护连接转发策略,长时间无流量,连接也会被清除,而且很多都不告诉两层机器,新的包过来时才通告rst。

5.8K10

TCP 窗口缩放、时间戳和 SACK

Linux TCP 协议栈具有无数个可以更改其行为的 sysctl 旋钮。 这包括可用于接收或发送操作的内存量、套接字的最大数量、可选的特性和协议扩展。...幸运的是,默认情况下,几乎每个 TCP 栈都支持并默认启用了此选项,包括 Linux。 响应方包括了它自己所需的缩放因子。两个对等方可以使用不同的因子。宣布缩放因子为 0 也是合法的。...因此,内核在接收/发送数据包时总是采用微秒级的时间戳。 在包处理步骤的其余部分中,Linux 会重用 RTT 估算所需的时钟时间戳。这还避免了将时间戳添加到传出 TCP 数据包的额外时钟访问。...从 Linux 4.12 开始,TCP 时间戳不再显示正常运行时间。发送的所有时间戳值都使用对等设备特定的偏移量。时间戳值也每 49 天回绕一次。...当 Linux 系统接受来自此类设备的连接时,TCP 会自动为受影响的连接禁用 SACK。 总结 本文中研究的三个 TCP 扩展都与 TCP 性能有关,最好都保留其默认设置:启用。

1.3K10

Linux时间命令

Linux一般有系统时间和硬件时间之分,date命令是显示和操作系统时间;hwclock用来操作硬件时间(日期)。日期和时间很重要,比如错误的日期和时间会导致你不能编译程序。...[+格式] 作用:可以用来显示或设定系统的日期与时间。 常用参数: -d  显示字符串所指的日期与时间。字符串前后必须加上双引号。 -s  根据字符串来设置日期与时间。...设置系统时间: date -s    需要有root权限 date -s 20160616 设置系统时间为20160616 date -s 10:50:30 设置系统时间为10:50:30...2 hwclock 可以用来显示或者设置硬件时间 记住下面的用法即可: hwclock 查看硬件时间 hwclock -w 修改硬件时间,改成和系统时间一样 hwclock -s 修改系统时间...,改成和硬件时间一样 示例: ?

5K20

TCP 应答时间参数对网络性能的影响

于是,下面引入延迟 ACK 机制:TCP 在接收到数据时不立即向发送方返回 ACK,而是延迟发送。一般延迟时间是 200ms。...在等待发送 ACK 期间,TCP 收集需要往另一端发送的数据,直到收集的数据大小超过 MSS 的定义或者延迟时间超时,TCP 才将 ACK 信息和需要发送的数据合并成一个报文一起发送。...TCP 应答的延迟的时间统计是从收到包开始统计的,因此,对于包较小的情况 tcp_nodelayack 的效果要明显大于包比较大的情况。...节点 A 向节点 B 发比较大的网络包,B 在接收到包的时候,就开始计算 ACK 延迟时间,由于包较大,接收需要一定的时间,网络包接收完毕以后,查看应答延迟,如果延迟时间 - 收包的时间 <=0, 那么...在这种情况下,即使 tcp_nodelayack 设置为 1,也就是没有延迟,由于网络包较大,接收时间较长,延迟还是比接收小的数据包要大一些。

2.4K120
领券