在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,那表明连接已经断开,我们的接收操作也应该结束。
iReadSizeOnce=read(iOpenCom,RxBuf+iReadSize,1024);
if (iReadSizeOnce != ZERO)
{
if (iReadSizeOnce != EAGAIN)
{
continue;
}
else
{
//stCComApiLog.LogError("读串口操作错误");
return(FUN_ERROR);
}
}
分享到:
相关推荐
Linux 错误码大全是 Linux 系统中一个非常重要的概念,它记录了各种可能出现的错误码及其对应的含义。这些错误码是通过 errno 变量来表示的,当 Linux C API 函数发生异常时, errno 变量将被赋予一个整数值,该值...
在Linux中,socket错误码是通过系统调用的返回值来表示的。错误码表示了操作失败的具体原因,开发者需要根据错误码来进行错误处理和调试。下面将详细解释一些常见的socket错误码及其含义。 EINTR(中断的系统调用)...
在LINUX网络编程过程中,开发者经常会遇到一些特定的错误码,比如EINTR、ETIMEOUT、EAGAIN等。这些错误码对于理解网络编程中的异常情况至关重要。下面我们将详细介绍这些错误码的含义及其应用场景。 #### EINTR ...
Linux 网络编程中,socket 错误码是常见的困扰开发者的问题,本文将对 socket 错误码进行分析,帮助开发者更好地理解和解决这些错误。 EINTR EINTR 错误码的值为 4,表示阻塞的操作被取消阻塞的调用打断。这种错误...
Linux系统错误与URB错误状态是USB设备驱动程序在与USB主机控制器交互时可能会遇到的问题。...通过深入理解这些错误代码的含义,开发者能够更有效地调试和优化驱动程序,确保USB设备在Linux系统上的稳定运行。
在Linux操作系统中,系统调用是应用程序与内核交互的重要方式之一。当系统调用失败时,通常会返回一个负数,并将具体的错误码存储在全局变量`errno`中。了解这些错误码对于排查问题至关重要。下面我们将详细介绍一些...
本文将深入解析Linux Socket编程中常见的错误及其含义,帮助开发者更好地理解和处理这些问题。 1. **EINTR** (4): 这个错误表示阻塞的操作被取消或者被中断。例如,如果你在发送或接收数据时设置了超时,当超时发生...
在探讨Linux下的“惊群”现象之前,我们首先需要理解这一术语的基本含义及其背后的技术背景。“惊群”(Wake Storm)是指在操作系统中,多个进程或线程因等待某一特定事件(如文件描述符的状态变化)而处于睡眠状态...
在Linux系统中,`errno11`通常与`EAGAIN`或`EWOULDBLOCK`错误代码关联,这是在进行非阻塞I/O操作时常见的一个错误。当我们使用非阻塞模式的socket进行数据传输时,可能会遇到这种错误。 在发送数据时,如果你尝试...
V4L2(Video for Linux 2)作为Linux下的视频设备驱动接口,在2.6内核版本之后成为了标准接口,相较于之前的V4L(Video for Linux)版本,V4L2进行了大量的改进和扩展,不仅支持了更多类型的设备(如video、dvb、FM...
在 Linux 和其他 Unix-like 操作系统中,这些错误码被定义在头文件中,如 `<asm-generic/errno-base.h>` 和 `<linux/asm-generic/errno.h>`。下面将对这些错误码进行详细的解释: 1. **EPERM (1)**: 表示“无权限”...