EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接

31 篇文章 1 订阅
 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 :     Success

errno1 :     Operation not permitted

errno2 :     No such file or directory

errno3 :     No such process

errno4 :     Interrupted system call

errno5 :     Input/output error

errno6 :     No such device or address

errno7 :     Argument list too long

errno8 :     Exec format error

errno9 :     Bad file descriptor

errno10 :    No child processes

errno11 :    Resource temporarily unavailable

errno12 :    Cannot allocate memory

errno13 :    Permission denied

errno14 :    Bad address

errno15 :    Block device required

errno16 :    Device or resource busy

errno17 :    File exists

errno18 :    Invalid cross-device link

errno19 :    No such device

errno20 :    Not a directory

errno21 :    Is a directory

errno22 :    Invalid argument

errno23 :    Too many open files in system

errno24 :    Too many open files

errno25 :    Inappropriate ioctl for device

errno26 :    Text file busy

errno27 :    File too large

errno28 :    No space left on device

errno29 :    Illegal seek

errno30 :    Read-only file system

errno31 :    Too many links

errno32 :    Broken pipe

errno33 :    Numerical argument out of domain

errno34 :    Numerical result out of range

errno35 :    Resource deadlock avoided

errno36 :    File name too long

errno37 :    No locks available

errno38 :    Function not implemented

errno39 :    Directory not empty

errno40 :    Too many levels of symbolic links

errno41 :    Unknown error 41

errno42 :    No message of desired type

errno43 :    Identifier removed

errno44 :    Channel number out of range

errno45 :    Level 2 not synchronized

errno46 :    Level 3 halted

errno47 :    Level 3 reset

errno48 :    Link number out of range

errno49 :    Protocol driver not attached

errno50 :    No CSI structure available

errno51 :    Level 2 halted

errno52 :    Invalid exchange

errno53 :    Invalid request descriptor

errno54 :    Exchange full

errno55 :    No anode

errno56 :    Invalid request code

errno57 :    Invalid slot

errno58 :    Unknown error 58

errno59 :    Bad font file format

errno60 :    Device not a stream

errno61 :    No data available

errno62 :    Timer expired

errno63 :    Out of streams resources

errno64 :    Machine is not on the network

errno65 :    Package not installed

errno66 :    Object is remote

errno67 :    Link has been severed

errno68 :    Advertise error

errno69 :    Srmount error

errno70 :    Communication error on send

errno71 :    Protocol error

errno72 :    Multihop attempted

errno73 :    RFS specific error

errno74 :    Bad message

errno75 :    Value too large for defined datatype

errno76 :    Name not unique on network

errno77 :    File descriptor in bad state

errno78 :    Remote address changed

errno79 :    Can not access a needed sharedlibrary

errno80 :    Accessing a corrupted sharedlibrary

errno81 :    .lib section in a.out corrupted

errno82 :    Attempting to link in too manyshared libraries

errno83 :    Cannot exec a shared librarydirectly

errno84 :    Invalid or incomplete multibyte orwide character

errno85 :    Interrupted system call should berestarted

errno86 :    Streams pipe error

errno87 :    Too many users

errno88 :    Socket operation on non-socket

errno89 :    Destinationaddress required

errno90 :    Message too long

errno91 :    Protocol wrong type for socket

errno92 :    Protocol not available

errno93 :    Protocol not supported

errno94 :    Socket type not supported

errno95 :    Operation not supported

errno96 :    Protocol family not supported

errno97 :    Address family not supported byprotocol

errno98 :    Address already in use

errno99 :    Cannot assign requested address

errno100 :   Network is down

errno101 :   Network is unreachable

errno102 :   Network dropped connection onreset

errno103 :   Software caused connection abort

errno104 :   Connection reset by peer

errno105 :   No buffer space available

errno106 :   Transport endpoint is alreadyconnected

errno107 :   Transport endpoint is notconnected

errno108 :   Cannot send after transportendpoint shutdown

errno109 :   Too many references: cannot splice

errno110 :   Connection timed out

errno111 :   Connection refused

errno112 :   Host is down

errno113 :   No route to host

errno114 :   Operation already in progress

errno115 :   Operation now in progress

errno116 :   Stale NFS file handle

errno117 :   Structure needs cleaning

errno118 :   Not a XENIX named type file

errno119 :   No XENIX semaphores available

errno120 :   Is a named type file

errno121 :   Remote I/O error

errno122 :   Disk quota exceeded

errno123 :   No medium found

errno124 :   Wrong medium type

errno125 :   Operation canceled

errno126 :   Required key not available

errno127 :   Key has expired

errno128 :   Key has been revoked

errno129 :   Key was rejected by service

errno130 :   Owner died

errno131 :   State not recoverable

errno132 :   Operation not possible due toRF-kill

errno133 :   Unknown error 133

errno134 :   Unknown error 134

errno135 :   Unknown error 135

errno136 :   Unknown error 136

errno137 :   Unknown error 137

errno138 :   Unknown error 138

errno139 :   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

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值