我是靠谱客的博主 孝顺指甲油,最近开发中收集的这篇文章主要介绍EAGAIN、EWOULDBLOCK、EINTR与非阻塞的理解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

当socket设置为非阻塞的情况时(设置方法参考该文)

在select的时候,或者read的时候,都会遇到错误,并返回errno,

我们查看errno.h中会看到:

#define EINTR             4   /* Interrupted system call  */

#define EAGAIN          11  /* Resource unavailable, try again          */

#define EWOULDBLOCK    EAGAIN 

由上面可以看出来,EWOULDBLOCK与EAGAIN 等价,我们当做一个errno处理即可。

select示例:


for(;;)
{
status = select(socket + 1, &fd_read, (fd_set *)0, (fd_set *)0, &wwait);
if(status < 0)
{
if((errno == EINTR) || (errno == EAGAIN))
continue;
printf("%s", strerror(errno));
return -1;
}
else if(status == 0)
{
//timeout
printf("%s", strerror(errno));
return 0;
}
break;
}

 read示例:

int myfunc(int length,int socket,char *pBufRecv)
{
int nleft, nread;
nleft = length;
while(nleft > 0)
{
nread = recv(socket, pBufRecv, nleft,0);
//if the connection has been gracefully closed, the return value is zero.
if(nread == 0)
{
printf("%s", strerror(errno));
return -1;
}
if(nread < 0)
{
if(errno == EINTR ||(errno == EAGAIN))
continue;
if(errno == EWOULDBLOCK)
continue;
printf("%s", strerror(errno));
return -1;
}
nleft -= nread;
pBufRecv += nread;
}
return(length - nleft);
}

 

最后

以上就是孝顺指甲油为你收集整理的EAGAIN、EWOULDBLOCK、EINTR与非阻塞的理解的全部内容,希望文章能够帮你解决EAGAIN、EWOULDBLOCK、EINTR与非阻塞的理解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部