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

我可以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()调用将像平常一样工作,除非它不会真正移除来自套接字内部缓冲区的任何字节。 您可能可以使用它来捕获错误而不更改套接字的内部状态。

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

相关推荐