我可以testing一个文件描述符是否为read的正确types?

有很多无法读取的fds(例如,监听套接字)。 如何testingfd上的read (2)是否会返回EINVAL ,而不冒冒险取出数据的风险?

事情不起作用:

我们可以通过传递一个零字节的缓冲区来做一个read() 。 这是排除在外:

对于零字节的read()请求执行错误检查是允许的,但不是必需的。 [来自POSIX 1003.1-2008]

我们可能会试图在描述符上调用select() 。 不幸的是, select()对于可读集有很重的语义,所以会告诉一个fd是“可读的”,实际上对它调用read()是错误的(例如,一个监听套接字将被标记为“可读”但是需要accept() ,而不是read() ,还有其他不可移植的例子,比如event或者kqueue fds)。

将现有函数复制到内存缓冲区中

C PF_PACKET链路层处理

使用C读取大文件(大于4GB)使用读取function,导致问题

awk的认字段分隔符

在C共享内存和MAP_ANONYMOUS失踪?

(作品分类)阅读每个平台的testingfd与特定的系统调用编译生成一个函数,看起来大致像:

int isReadable(int fd) { return isActiveSocket(fd) || isFifo(fd) || isRegFile(fd) || isEventFd(fd) || ... /* more pain */ }

(作品种类)请注意, read()本身不一定给你一个很好的答案,关于fd是否是系统调用的正确types! 令人惊讶的是, EINVAL在POSIX中没有被指定为read() (除了STREAMS),但是在linux上(EINVAL:fd被附加到一个不适合读取的对象上)给了你,而神秘地在BSD上(“EINVAL:与[fd]相关联的指针是负数。“)。

scheme

有人启动你的应用程序,你想知道值为0的fd是否是伪造的(例如一个监听套接字),或者是否有可能读取它。 你不想尝试一个实际的read() a),因为这个块,b)因为在取出数据之后,你不能把它填满。

如何将FIN标志发送到主机而不closures套接

setlocale()的认值是什么意思?

由pthread_kill引起的分割错误

如何从asynchronous套接字连接报告错误

在未来的时间调用function

不,你自己引用了规范的相关部分。

事实上,由于许多原因,阅读可能会随时失败。 测试“会读取成功”,然后read ,只是引入竞争条件 – 两个电话之间的情况可能会改变。

您需要编写应用程序,以便正确处理失败的读取。 如果你这样做,你通常不需要事先关心测试,并且可以简单地使用select来确定数据何时(可能)可用。

是否有一个原因,你不能使用fcntl与F_GETXFL选项?

int isread(int fd) { int o_accmode=0; int rc=fcntl(fd,F_GETXFL,&o_accmode); if(rc == -1 ) return rc; rc=(o_accmode & O_ACCMODE); return (rc==O_RDONLY || rc==RDWR); }

可能最简单的是使用select :

int is_valid_descriptor( int fd ) { fd_set rd; struct timeval t = { 0,0 }; FD_ZERO( &rd ); FD_SET( fd,&rd ); return -1 != select( fd + 1,&rd,NULL,&t ); }

请注意,这并不表示读取是否会阻塞(“成功”的含义并不清楚)。

假设你可以调用recv()而不是read()(它们通常可以互换套接字),你可以在flags参数中提供MSG_PEEK,recv()调用将像平常一样工作,除非它不会真正移除来自套接字内部缓冲区的任何字节。 您可能可以使用它来捕获错误而不更改套接字的内部状态。

相关文章

本篇内容主要讲解“gitee如何上传代码”,感兴趣的朋友不妨来...
这篇“从gitee上下的代码如何用”文章的知识点大部分人都不太...
这篇文章主要介绍“gitee如何下载仓库里的项目”,在日常操作...
本篇内容主要讲解“怎么在Gitee上更新代码”,感兴趣的朋友不...
本文小编为大家详细介绍“怎么将工程托管到gitee”,内容详细...
这篇文章主要介绍了gitee中图片大小如何调整的相关知识,内容...