c - 将文件描述符读入 NULL 是否合法?
问题描述
最近,为了我正在编写的库,我一直在修复时间步长。经过一些研究,假设我最终得到了这个原型,它精确且易于与我的库的通用事件系统结合:
#include <stdio.h>
#include <unistd.h>
#include <sys/timerfd.h>
#include <poll.h>
struct pollfd fds[1];
struct itimerspec its;
int main(void) {
fds[0] = (struct pollfd) {timerfd_create(CLOCK_MONOTONIC, 0), POLLIN, 0}; //long live clarity
its.it_interval = (struct timespec) {0, 16666667};
its.it_value = (struct timespec) {0, 16666667};
timerfd_settime(fds[0].fd, 0, &its, NULL);
while(1) {
poll(fds, 1, -1);
if(fds[0].revents == POLLIN) {
long long buffer;
read(fds[0].fd, &buffer, 8);
printf("ROFL\n");
} else {
printf("BOOM\n");
break;
}
}
close(fds[0].fd);
return 0;
}
但是,为了使计时器的文件描述符可重用,我不得不用宝贵的 8 字节数据污染我的 CPU 缓存,这严重伤害了我。因此,我尝试将read()
调用替换为lseek()
,如下所示:
lseek(fds[0].fd, 0, SEEK_END);
不幸的是,这甚至lseek(fds[0].fd, 8, SEEK_CUR);
给了我ESPIPE
错误并且不起作用。但是后来,我发现尽管给出了EFAULT
s,但以下内容实际上完成了它的工作:
read(fds[0].fd, NULL, 8);
像这样偏移文件描述符是否合法,已定义的行为?如果不是(正如EFAULT
s 向我建议的那样,足以避免使用那个天才),是否存在一个函数可以丢弃读取的数据,而不会将其写下来,或者以其他方式抵消我的计时器的文件描述符?
解决方案
推荐阅读
- c# - Gradle插件返回错误消息
- linux - bash - 获取正确处理新行的环境变量列表
- javascript - 将数据从父道具发送到子道具返回一个值,然后是未定义的功能组件
- javascript - Angular:无法读取 null 的属性(读取“cannotContainSpace”)
- typescript - 如何设置主 Vue 3 'app' 变量的 'type'
- node.js - 有人可以帮我做一个不和谐计数游戏吗
- python - 如何在 django 的某些视图中避免 THOUSAND SEPARATOR?
- python - `open` 不创建文件
- ado.net - 从 DataTable 到 DTO 的 AutoMapper
- c# - 从 ASP.NET MVC 操作方法返回文件 - 此请求已被阻止,因为敏感信息