EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接
EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接
EWOULDBLOCK用于非阻塞模式,不需要重新读或者写
EINTR指操作被中断唤醒,需要重新读/写在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中)。
从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候。例如,以 O_NONBLOCK的标志打开文件/socket/FIFO,如果你连续做read操作而没有数据可读。此时程序不会阻塞起来等待数据准备就绪返 回,read函数会返回一个错误EAGAIN,提示你的应用程序现在没有数据可读请稍后再试。
又例如,当一个系统调用(比如fork)因为没有足够的资源(比如虚拟内存)而执行失败,返回EAGAIN提示其再调用一次(也许下次就能成功)。
Linux - 非阻塞socket编程处理EAGAIN错误
在linux进行非阻塞的socket接收数据时经常出现Resource temporarily unavailable,errno代码为11(EAGAIN),这是什么意思?
这表明你在非阻塞模式下调用了阻塞操作,在该操作没有完成就返回这个错误,这个错误不会破坏socket的同步,不用管它,下次循环接着recv就可以。 对非阻塞socket而言,EAGAIN不是一种错误。在VxWorks和Windows上,EAGAIN的名字叫做EWOULDBLOCK。
另外,如果出现EINTR即errno为4,错误描述Interrupted system call,操作也应该继续。
最后,如果recv的返回值为0,那表明连接已经断开,我们的接收操作也应该结束。
转载自:http://blog.chinaunix.net/uid-23849526-id-120552.html
static void lx_recv_callback(struct ev_loop *loop, ev_io *w, int revents)
{char buffer[4096] = { 0 };int ret = 0;//ev_io write_event;192.168.206.129
loop:ret = recv(w->fd, buffer, LX_MAXLEN, 0);if (ret > 0) {//lx_print("thread[%lu] recv message :%s \n", pthread_self(), buffer);gstTcpDevice.parse.unpackFunc(&(gstTcpDevice.parse), (uint8_t *)buffer, ret);} else if (ret == 0) {gstTcpDevice.is_need_reconnect = 1;//lx_error("thread[%lu] remote socket closed!socket fd: %d, errno=%d\n", pthread_self(), w->fd, errno);return;} else {if (errno == EAGAIN || errno == EWOULDBLOCK) {goto loop;}if (errno == ETIMEDOUT) { //client close//lx_error("thread[%lu] ret :%d ,close socket fd : %d, errno:%d, client cannot connect\n", pthread_self(), ret, w->fd, errno);gstTcpDevice.is_need_reconnect = 1;return;} else {//lx_error("thread[%lu] ret :%d ,close socket fd : %d, errno:%d\n", pthread_self(), ret, w->fd, errno);gstTcpDevice.is_need_reconnect = 1;return;}}
}
errno对照表
errno0 : Successerrno1 : Operation not permittederrno2 : No such file or directoryerrno3 : No such processerrno4 : Interrupted system callerrno5 : Input/output errorerrno6 : No such device or addresserrno7 : Argument list too longerrno8 : Exec format errorerrno9 : Bad file descriptorerrno10 : No child processeserrno11 : Resource temporarily unavailableerrno12 : Cannot allocate memoryerrno13 : Permission deniederrno14 : Bad addresserrno15 : Block device requirederrno16 : Device or resource busyerrno17 : File existserrno18 : Invalid cross-device linkerrno19 : No such deviceerrno20 : Not a directoryerrno21 : Is a directoryerrno22 : Invalid argumenterrno23 : Too many open files in systemerrno24 : Too many open fileserrno25 : Inappropriate ioctl for deviceerrno26 : Text file busyerrno27 : File too largeerrno28 : No space left on deviceerrno29 : Illegal seekerrno30 : Read-only file systemerrno31 : Too many linkserrno32 : Broken pipeerrno33 : Numerical argument out of domainerrno34 : Numerical result out of rangeerrno35 : Resource deadlock avoidederrno36 : File name too longerrno37 : No locks availableerrno38 : Function not implementederrno39 : Directory not emptyerrno40 : Too many levels of symbolic linkserrno41 : Unknown error 41errno42 : No message of desired typeerrno43 : Identifier removederrno44 : Channel number out of rangeerrno45 : Level 2 not synchronizederrno46 : Level 3 haltederrno47 : Level 3 reseterrno48 : Link number out of rangeerrno49 : Protocol driver not attachederrno50 : No CSI structure availableerrno51 : Level 2 haltederrno52 : Invalid exchangeerrno53 : Invalid request descriptorerrno54 : Exchange fullerrno55 : No anodeerrno56 : Invalid request codeerrno57 : Invalid sloterrno58 : Unknown error 58errno59 : Bad font file formaterrno60 : Device not a streamerrno61 : No data availableerrno62 : Timer expirederrno63 : Out of streams resourceserrno64 : Machine is not on the networkerrno65 : Package not installederrno66 : Object is remoteerrno67 : Link has been severederrno68 : Advertise errorerrno69 : Srmount errorerrno70 : Communication error on senderrno71 : Protocol errorerrno72 : Multihop attemptederrno73 : RFS specific errorerrno74 : Bad messageerrno75 : Value too large for defined datatypeerrno76 : Name not unique on networkerrno77 : File descriptor in bad stateerrno78 : Remote address changederrno79 : Can not access a needed sharedlibraryerrno80 : Accessing a corrupted sharedlibraryerrno81 : .lib section in a.out corruptederrno82 : Attempting to link in too manyshared librarieserrno83 : Cannot exec a shared librarydirectlyerrno84 : Invalid or incomplete multibyte orwide charactererrno85 : Interrupted system call should berestartederrno86 : Streams pipe errorerrno87 : Too many userserrno88 : Socket operation on non-socketerrno89 : Destinationaddress requirederrno90 : Message too longerrno91 : Protocol wrong type for socketerrno92 : Protocol not availableerrno93 : Protocol not supportederrno94 : Socket type not supportederrno95 : Operation not supportederrno96 : Protocol family not supportederrno97 : Address family not supported byprotocolerrno98 : Address already in useerrno99 : Cannot assign requested addresserrno100 : Network is downerrno101 : Network is unreachableerrno102 : Network dropped connection onreseterrno103 : Software caused connection aborterrno104 : Connection reset by peererrno105 : No buffer space availableerrno106 : Transport endpoint is alreadyconnectederrno107 : Transport endpoint is notconnectederrno108 : Cannot send after transportendpoint shutdownerrno109 : Too many references: cannot spliceerrno110 : Connection timed outerrno111 : Connection refusederrno112 : Host is downerrno113 : No route to hosterrno114 : Operation already in progresserrno115 : Operation now in progresserrno116 : Stale NFS file handleerrno117 : Structure needs cleaningerrno118 : Not a XENIX named type fileerrno119 : No XENIX semaphores availableerrno120 : Is a named type fileerrno121 : Remote I/O errorerrno122 : Disk quota exceedederrno123 : No medium founderrno124 : Wrong medium typeerrno125 : Operation cancelederrno126 : Required key not availableerrno127 : Key has expirederrno128 : Key has been revokederrno129 : Key was rejected by serviceerrno130 : Owner diederrno131 : State not recoverableerrno132 : Operation not possible due toRF-killerrno133 : Unknown error 133errno134 : Unknown error 134errno135 : Unknown error 135errno136 : Unknown error 136errno137 : Unknown error 137errno138 : Unknown error 138errno139 : Unknown error 139由上可见Linux对错误宏的定义。头文件 /usr/include/asm-generic/errno-base.h 的源码:#ifndef _ASM_GENERIC_ERRNO_BASE_H
#define _ASM_GENERIC_ERRNO_BASE_H#define EPERM 1 /* Operation not permitted */
#define ENOENT2/* No such file or directory */
#define ESRCH 3 /* No such process */
#define EINTR 4 /* Interrupted system call */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Argument list too long */
#define ENOEXEC8/* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD10/* No child processes */
#define EAGAIN11/* Try again */
#define ENOMEM12/* Out of memory */
#define EACCES13/* Permission denied */
#define EFAULT14/* Bad address */
#define ENOTBLK15/* Block device required */
#define EBUSY 16 /* Device or resource busy */
#define EEXIST17/* File exists */
#define EXDEV 18 /* Cross-device link */
#define ENODEV19/* No such device */
#define ENOTDIR20/* Not a directory */
#define EISDIR21/* Is a directory */
#define EINVAL22/* Invalid argument */
#define ENFILE23/* File table overflow */
#define EMFILE24/* Too many open files */
#define ENOTTY25/* Not a typewriter */
#define ETXTBSY26/* Text file busy */
#define EFBIG 27 /* File too large */
#define ENOSPC28/* No space left on device */
#define ESPIPE29/* Illegal seek */
#define EROFS 30 /* Read-only file system */
#define EMLINK31/* Too many links */
#define EPIPE 32 /* Broken pipe */
#define EDOM 33 /* Math argument out of domain of func */
#define ERANGE34/* Math result not representable */#endif头文件/usr/include/asm-generic/erno.h源码:#ifndef _ASM_GENERIC_ERRNO_H
#define _ASM_GENERIC_ERRNO_H#include <asm-generic/errno-base.h>#define EDEADLK35/* Resource deadlock would occur */
#define ENAMETOOLONG36/* File name too long */
#define ENOLCK37/* No record locks available */
#define ENOSYS38/* Function not implemented */
#define ENOTEMPTY39/* Directory not empty */
#define ELOOP 40 /* Too many symbolic links encountered */
#define EWOULDBLOCKEAGAIN/* Operation would block */
#define ENOMSG42/* No message of desired type */
#define EIDRM 43 /* Identifier removed */
#define ECHRNG44/* Channel number out of range */
#define EL2NSYNC45/* Level 2 not synchronized */
#define EL3HLT46/* Level 3 halted */
#define EL3RST47/* Level 3 reset */
#define ELNRNG48/* Link number out of range */
#define EUNATCH49/* Protocol driver not attached */
#define ENOCSI50/* No CSI structure available */
#define EL2HLT51/* Level 2 halted */
#define EBADE 52 /* Invalid exchange */
#define EBADR 53 /* Invalid request descriptor */
#define EXFULL54/* Exchange full */
#define ENOANO55/* No anode */
#define EBADRQC56/* Invalid request code */
#define EBADSLT57/* Invalid slot */#define EDEADLOCKEDEADLK#define EBFONT59/* Bad font file format */
#define ENOSTR60/* Device not a stream */
#define ENODATA61/* No data available */
#define ETIME 62 /* Timer expired */
#define ENOSR 63 /* Out of streams resources */
#define ENONET64/* Machine is not on the network */
#define ENOPKG65/* Package not installed */
#define EREMOTE66/* Object is remote */
#define ENOLINK67/* Link has been severed */
#define EADV 68 /* Advertise error */
#define ESRMNT69/* Srmount error */
#define ECOMM 70 /* Communication error on send */
#define EPROTO71/* Protocol error */
#define EMULTIHOP72/* Multihop attempted */
#define EDOTDOT73/* RFS specific error */
#define EBADMSG74/* Not a data message */
#define EOVERFLOW75/* Value too large for defined data type */
#define ENOTUNIQ76/* Name not unique on network */
#define EBADFD77/* File descriptor in bad state */
#define EREMCHG78/* Remote address changed */
#define ELIBACC79/* Can not access a needed shared library */
#define ELIBBAD80/* Accessing a corrupted shared library */
#define ELIBSCN81/* .lib section in a.out corrupted */
#define ELIBMAX82/* Attempting to link in too many shared libraries */
#define ELIBEXEC83/* Cannot exec a shared library directly */
#define EILSEQ84/* Illegal byte sequence */
#define ERESTART85/* Interrupted system call should be restarted */
#define ESTRPIPE86/* Streams pipe error */
#define EUSERS87/* Too many users */
#define ENOTSOCK88/* Socket operation on non-socket */
#define EDESTADDRREQ89/* Destination address required */
#define EMSGSIZE90/* Message too long */
#define EPROTOTYPE91/* Protocol wrong type for socket */
#define ENOPROTOOPT92/* Protocol not available */
#define EPROTONOSUPPORT93/* Protocol not supported */
#define ESOCKTNOSUPPORT94/* Socket type not supported */
#define EOPNOTSUPP95/* Operation not supported on transport endpoint */
#define EPFNOSUPPORT96/* Protocol family not supported */
#define EAFNOSUPPORT97/* Address family not supported by protocol */
#define EADDRINUSE98/* Address already in use */
#define EADDRNOTAVAIL99/* Cannot assign requested address */
#define ENETDOWN100/* Network is down */
#define ENETUNREACH101/* Network is unreachable */
#define ENETRESET102/* Network dropped connection because of reset */
#define ECONNABORTED103/* Software caused connection abort */
#define ECONNRESET104/* Connection reset by peer */
#define ENOBUFS105/* No buffer space available */
#define EISCONN106/* Transport endpoint is already connected */
#define ENOTCONN107/* Transport endpoint is not connected */
#define ESHUTDOWN108/* Cannot send after transport endpoint shutdown */
#define ETOOMANYREFS109/* Too many references: cannot splice */
#define ETIMEDOUT110/* Connection timed out */
#define ECONNREFUSED111/* Connection refused */
#define EHOSTDOWN112/* Host is down */
#define EHOSTUNREACH113/* No route to host */
#define EALREADY114/* Operation already in progress */
#define EINPROGRESS115/* Operation now in progress */
#define ESTALE116/* Stale NFS file handle */
#define EUCLEAN117/* Structure needs cleaning */
#define ENOTNAM118/* Not a XENIX named type file */
#define ENAVAIL119/* No XENIX semaphores available */
#define EISNAM120/* Is a named type file */
#define EREMOTEIO121/* Remote I/O error */
#define EDQUOT122/* Quota exceeded */#define ENOMEDIUM123/* No medium found */
#define EMEDIUMTYPE124/* Wrong medium type */
#define ECANCELED125/* Operation Canceled */
#define ENOKEY126/* Required key not available */
#define EKEYEXPIRED127/* Key has expired */
#define EKEYREVOKED128/* Key has been revoked */
#define EKEYREJECTED129/* Key was rejected by service *//* for robust mutexes */
#define EOWNERDEAD130/* Owner died */
#define ENOTRECOVERABLE131/* State not recoverable */#define ERFKILL 132/* Operation not possible due to RF-kill */#endif
EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接相关推荐
- linux socket 套接字状态 EAGAIN EWOULDBLOCK EINTR 与非阻塞 简介
EWOULDBLOCK:用于非阻塞模式,不需要重新读或者写 EINTR:指操作被中断唤醒,需要重新读/写 在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一 ...
- EAGAIN、EWOULDBLOCK、EINTR与非阻塞
EWOULDBLOCK:用于非阻塞模式,不需要重新读或者写 EINTR:指操作被中断唤醒,需要重新读/写 在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一 ...
- spring 实现异步非阻塞长轮询
一. 前言 今天接到一个扫码登录的需求.想一想很简单,服务端提供一个获取二维码接口,在提供一个查询扫码状态的接口,客户端不停轮询"查询扫码状态接口"判断用户是否已扫码登录,并很快实 ...
- EAGAIN、EWOULDBLOCK、EINTR与非阻塞的理解
当socket设置为非阻塞的情况时(设置方法参考该文) 在select的时候,或者read的时候,都会遇到错误,并返回errno, 我们查看errno.h中会看到: #define EINTR ...
- ffmpeg中关于EAGAIN的理解及非阻塞IO
ffmpeg为在linux下开发的开源音视频框架,所以经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中). try again,从字面上来看,是提示 ...
- 关于非阻塞的recv的时候返回的处理
注意recv()如果读到数据为0,那么就表示文件结束了,如果在读的过程中遇到了中断那么会返回-1,同时置errno为EINTR. 因此判断recv的条件: 如果read返回<=0 ...
- 【Linux Socket C++】为什么IO复用需要用到非阻塞IO?EAGAIN的简单介绍与应用
目录 为什么IO复用需要非阻塞的IO EAGAIN的介绍 EAGAIN的应用 为什么IO复用需要非阻塞的IO 我们可以先看一下官方的回答: 在Linux命令行输入:man 2 select 找到[BU ...
- linux网络编程--阻塞与非阻塞
linux网络编程--阻塞与非阻塞 建立连接 接受连接 无阻塞的设置方式 read() write() 读操作 写操作 Linux fcntl函数详解 功能描述 函数原型 fcntl()函数五种功能 ...
- linux下的阻塞和非阻塞
读常规文件是不会阻塞的,不管读多少字节,read 一定会在有限的时间内返回.从终 端设备或网络读则不一定,如果从终端输入的数据没有换行符,调用 read 读终端设备就会 阻塞,如果网络 ...
最新文章
- C++中图像处理的类之二 CImg
- [你必须知道的.NET]第十八回:对象创建始末(上)
- python中与label类似的控件是_python中tkinter的使用(控件整理)(一)
- bitcount方法详解_Java Long类的bitCount()方法和示例
- JavaScript 中的函数介绍
- fetch first mysql_MySQL多版本并发控制机制(MVCC)源码浅析
- 微软杀毒软件 Microsoft Defender 将发布 Linux 版本
- Web加固linux,Linux系统下web服务器的加固
- SpringBoot-源码阅读
- 区块链开发(一)搭建基于以太坊的私有链环境
- 初学RFID-破解学校水卡
- c/c++利用ghostscript API打印机pdf文件
- 计算机网络中sep是什么意思,SEP系统介绍及实施方案介绍.ppt
- 华为手机NFC模拟加密的门禁卡详细教程
- python海龟绘图画玫瑰花的简笔画_用python的小海龟 Turtle 画一朵好看又有趣的小花-Go语言中文社区...
- 视觉技术再赋能,深眸科技一体化解决方案引领工业视觉机器人落地应用
- 科学上网后(关掉VPN)之后无法正常连接网络
- 洛谷 P2791 幼儿园篮球题
- 知識は潜在能力、行動は力CommentsAdd Star
- java心得!--很好的java学习历程(转自张国宝)