C 将文件描述符读入NULL是否合法?

C 将文件描述符读入NULL是否合法?,c,linux,file-descriptor,C,Linux,File Descriptor,最近,我一直在为我正在写的图书馆而努力。经过一些研究,假设我最终得到了这个原型,精确且易于与我的库的通用事件系统结合: #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

最近,我一直在为我正在写的图书馆而努力。经过一些研究,假设我最终得到了这个原型,精确且易于与我的库的通用事件系统结合:

#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;
}
不幸的是,这两个,甚至lseekfds[0].fd,8,SEEK_CUR;给了我ESPIPE错误,无法工作。但后来,我发现,尽管给出了EFAULT,但以下各项确实起到了作用:


像这样偏移文件描述符是合法的、已定义的行为吗?如果不是像EFAULTs向我建议的那样,强烈地避免使用这一天才,那么是否存在一个函数可以丢弃读取的数据,而不将其记录下来,或以其他方式偏移计时器的文件描述符?

的POSIX规范没有指定将空指针作为缓冲区参数传递的结果。没有给出具体的错误代码,也没有说明是否从描述符读取任何数据

但是,存在以下错误:

EFAULT buf在您的可访问地址空间之外

不过,它并没有说它将读取8个字节,并在发生这种情况时丢弃它们


因此,我认为您不能指望它按您的意愿工作。

的POSIX规范没有指定传递空指针作为缓冲区参数的后果。没有给出具体的错误代码,也没有说明是否从描述符读取任何数据

但是,存在以下错误:

EFAULT buf在您的可访问地址空间之外

不过,它并没有说它将读取8个字节,并在发生这种情况时丢弃它们


因此,我认为您不能指望它按您的意愿工作。

读取函数系统调用很可能会失败,并将EINVAL作为错误,而不是实际读取任何内容。不,您不应该传递一个空指针来读取-但是当您尝试时内核不会崩溃。这是一种验证指针是否有效的方法,但速度不快。问题是,我没有传递空指针和计数0,而是传递空指针和计数8,显然它实际上偏移了这8个字节作为副作用。。。是否碰巧知道它比正常读取速度慢,或者只是正常的预期速度?请检查来自的返回值,如果是负值,请检查errno中的值。指针无效-您很可能会得到返回值-1和errno==EINVAL。没有数据会被读取,因为没有有效的存储空间。当然,数据不会被读取到我可以读取的地方,但假设这正是我希望以合法的方式发生的事情,我很有信心时间步长正确,因此,到目前为止,我尝试的任何地方都肯定会偏移文件描述符;如果不是这样,ROFLrotor将很快超速,也就是说:有趣的是,POSIX规范没有记录无效缓冲区指针null指针的错误-但是除非行为是文档,否则不应该使用null指针调用函数;当您这样做时,您会调用未定义的行为。在macOS Mojave 1014.6上,读取手册页记录了错误[EFAULT]-Buf指向分配的地址空间之外。读取函数系统调用很可能会失败,并将EINVAL作为错误,而不是实际读取任何内容。不,您不应该传递一个空指针来读取-但是当您尝试时内核不会崩溃。这是一种验证指针是否有效的方法,但速度不快。问题是,我没有传递空指针和计数0,而是传递空指针和计数8,显然它实际上偏移了这8个字节作为副作用。。。是否碰巧知道它比正常读取速度慢,或者只是正常的预期速度?请检查来自的返回值,如果是负值,请检查errno中的值。指针无效-您很可能会得到返回值-1和errno==EINVAL。没有数据会被读取,因为没有有效的存储空间。当然,数据不会被读取到我可以读取的地方,但假设这正是我希望以合法的方式发生的事情,我很有信心时间步长正确,因此,到目前为止,我尝试的任何地方都肯定会偏移文件描述符;如果不是这样,ROFLrotor将很快超速,也就是说:有趣的是,POSIX规范没有记录无效缓冲区指针null指针的错误-但是除非行为是文档,否则不应该使用null指针调用函数;当您这样做时,您会调用未定义的行为。在macOS Mojave 1014.6上,读取手册页记录了错误[EFAULT]-Buf指向分配的地址空间之外。谢谢你的回答!是否碰巧存在一些我不知道的东西,可以更接近我想要的东西,即在不读取任何内容的情况下增加偏移量,或者实际上已读取
正在定义描述符必须在此处显示的最佳匹配?如果流不可查找,则不会显示。感谢您的回答!是否碰巧存在一些我不知道的东西,可以更接近我想要的东西,即在不读取任何内容的情况下增加偏移量,或者实际上正在读取描述符所说的最佳匹配?如果流不可查找,则不会。
lseek(fds[0].fd, 0, SEEK_END);
read(fds[0].fd, NULL, 8);