微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么以下打印“资源暂时不可用”?

为什么下面的代码打印“read():资源暂时不可用”80%的时间? 那就是EAGAIN代码,它和WOULD BLOCK是一样的,这意味着没有数据在等待被读取,但是select返回1表示有数据(在Linux中testing过):

#include <time.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/errno.h> int main(int argc,char** argv) { int fd = open("/dev/lp0",O_RDWR | O_NONBLOCK); int ret = 0; int status = 0; char buffer[1024]; char teststr[] = "This is a testn"; char XMIT_STATUS_OFFLINE[] = {0x10,0x04,0x02}; char XMIT_STATUS_ERROR[] = {0x10,0x03}; char XMIT_STATUS_ROLL[] = {0x10,0x04}; char XMIT_STATUS_SLIP[] = {0x10,0x05}; fd_set rfds; FD_ZERO( &rfds ); FD_SET( fd,&rfds ); struct timeval sleep; sleep.tv_sec = 5; sleep.tv_usec = 0; /* Offline status */ ret = write(fd,XMIT_STATUS_OFFLINE,sizeof(XMIT_STATUS_OFFLINE)); //printf("write() returned %dn",ret); do { ret = select( fd + 1,&rfds,NULL,&sleep ); } while (ret < 0 && (errno == EINTR)); ret = read(fd,buffer,1024); if(ret == -1) { perror("read(): "); } else { status = buffer[0]; if((status & 0x04) != 0) { printf("The cover is open.n"); } else { printf("OFFLINE is good.n"); } } close(fd); return 0; }

从标准input读()

在目录中查找最旧的文件(recursion)

“同步I / O”是否意味着“阻塞I / O”?

终止进程时是否可以删除文件

简单的I / O超时为Linux命令

如果没有数据可用,5秒钟超时后,您的选择呼叫将返回0。 你的代码将忽略这一点,并尝试从设备读取反正。 检查ret == 0,这将解决您的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐