首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从文件描述符中获得读取()的最小字节数?

如何从文件描述符中获得读取()的最小字节数?
EN

Stack Overflow用户
提问于 2015-12-01 17:56:07
回答 1查看 1.3K关注 0票数 0

编辑

我的主要目标是在select()通知传入数据后只刷新一个可读的文件描述符。正如Basile指出的那样,通过为read()提供足够大的缓冲区,我现在就实现了这个目标。这就是为什么我标记这个答案被接受的原因。

但是,标题中的问题尚未得到回答:如何从这样的文件描述符中读取最小字节数:

代码语言:javascript
复制
min_size = fd_get_chunksize(file_descriptor);

可能会返回1,4,8或其他东西。

原始问题

我有几个文件描述符以不同的方式创建。例如,使用timerfd_create(),并将其配置为每秒触发一次。

select()在某个FD上发出信号时,我想冲洗它。对于用timerfd_create()创建的文件,我必须至少读取8个字节:

代码语言:javascript
复制
if(select(fd + 1, &l_fdsRd, NULL, NULL, &l_timeOut)) {
    unsigned long long data;
    int count;
    while((count = read (fd, &data, sizeof(data))) > 0) {
        printf("%d %ld\n", count, data);
    }
}

data被声明为char,并因此大小(数据)为1时,count始终是0,而我的文件描述符永远不会被刷新。

如果我有多个要刷新的文件描述符(可能以不同的方式创建),我必须知道我必须读取的每个文件描述符的字节数。

是否有一种方法可以获得现有FD的字节数?

还有其他方法来刷新我用timerfd_create()创建的文件描述符吗?(我读过没有read()的文件描述符是空的还是“刷新”的?,但这个没有给我答案。)实际上,我不想阅读内容,只是想让它再次为select()做好准备。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-01 18:02:21

仔细阅读创建(2)

在计时器文件描述符上操作 timerfd_create()返回的文件描述符支持以下操作:读(2),如果定时器自上次使用timerfd_settime()修改其设置以来已过期一次或多次,或自上次成功读取(2)以来,则给读(2)的缓冲区返回一个无符号的8字节整数(uint64_t),其中包含已发生的过期数。(返回的值为主机字节顺序--即主机上整数的本机字节顺序。)如果在读取(2)时没有计时器到期,那么调用将一直阻塞直到下一个计时器到期,或者如果文件描述符已非阻塞(通过使用fcntl(2) F_SETFL操作来设置O_NONBLOCK标志),则使用错误EAGAIN失败。如果所提供的缓冲区的大小小于8个字节,那么read(2)将失败,从而导致错误EINVAL。轮询(2)、选择(2)(及类似的)如果发生了一个或多个计时器到期,文件描述符是可读的( select(2) readfds参数;轮询(2) POLLIN标志)。

因此,当文件描述符可读时,you真正的应该读取一个无符号的8字节整数。请注意,您不能只读取一个字节(提到EINVAL错误)。

因此宣布

代码语言:javascript
复制
uint64_t data;

对于普通的文件描述符,您知道应该读取多少字节。它可能是一个管道或插座(或鼠标设备)与小的固定长度的消息。但是通常情况下,最好是朗读 一个足够大的缓冲区(通常是几千字节的,最高可达1 be;也许64K字节= 65536字节可能是一种不太糟糕的权衡)。注意,读(2)在成功时返回一个字节计数,因此可以是部分读取。如果某些字节保持立即可读性,则下一个民意测验(2) (或几乎过时的select)将立即成功。

也请参阅管道(7)中关于管道容量的段落

您可能还会考虑旧的FIONBIO ioctl(2),但我不建议使用它(它不是很容易移植,语义定义也不太好:它可能会给出可读取的字节数)。见

避免读(2)-ing非常小的缓冲区(只有几个字节)。特别是,read-ing一次只能给出一个字节的性能。

顺便说一句,一些硬件块设备可能想要以若干块大小的倍数进行读(2),这通常适合于几千字节(例如一到两页)。YMMV

也许异步IO (参见aio(7))可能是有用的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34026924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档