gpt4 book ai didi

c - Lseek SEEK_END 不工作?

转载 作者:太空宇宙 更新时间:2023-11-04 06:16:35 29 4
gpt4 key购买 nike

我正在开发一个带有操纵杆的 C 程序,我想获取最后一个事件,即 js0 文件的最后一行。我试图将光标移到最后一个元素之前,但它似乎不起作用。知道为什么吗?

int fd = open ("/dev/input/js0", O_RDONLY);
struct js_event e;
lseek(fd, -(sizeof(e)), SEEK_END);
read (fd, &e, sizeof(e));
switch(e.type){
case JS_EVENT_BUTTON: printf("btn\n");
break;
case JS_EVENT_AXIS: printf("axes\n");
break;
default: printf("smth else\n");
}

我确定我正在阅读的文件至少有 (sizeof(e)) 长。 Lseek 返回 -1,所以我得到了 errno,它是 29 - 非法搜索:为什么这是非法搜索?即使我使用 0 作为偏移量,我也会得到相同的结果

  lseek(fd, 0, SEEK_END)

我使用的是最新版本的 Ubuntu,谢谢你的帮助

最佳答案

why should this be an illegal seek?

您尝试读取的文件是一个字符特殊文件(这是其模式字符串第一个位置的“c”表示的内容),内核的操纵杆驱动程序可以通过该文件与用户空间程序(例如您的程序)进行通信。这样的文件就像管道——不可搜索。任何在此类文件中寻找不同位置的尝试都将失败,并且某些 lseek() 实现可能会失败,即使参数对应于零净位置变化也是如此。您可以在此处找到有关设备文件的更多信息:What are character special and block special files in a unix system?

在评论中,你问

Any suggestion on how can I get last line?

,但这不太可能是您真正想要的。在这样一个表示通信 channel 的文件中,到达文件末尾(以便能够识别最后一行)表示 channel 已关闭并且已从中读取所有数据。不再有数据可以通过该文件描述符获得。在一般情况下,您的情况不会发生这种情况。我怀疑这是否是您希望观察到的。

我认为您想要的是从操纵杆设备中发现可用的最新事件,这在概念上很简单:您从设备读取事件直到读取 block ,或者会这样做。 The Linux kernel documentation for the device you're using有一些避免无限期阻塞的建议:

  • 在尝试读取数据之前,使用 select() 确定设备中的数据是否可用。

  • 以非阻塞模式打开设备(使用选项O_NONBLOCK),并为您的read() 做好准备s 失败(返回 -1),errno 设置为 EAGAIN

请注意,在任何情况下您都应该检查 read() 的返回值,并且至少有一种其他故障模式不一定是真正的错误(EINTR)。请阅读 its manual page ,以及您正在使用的其他函数的函数,以获取诸如此类的详细信息。

关于c - Lseek SEEK_END 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44531045/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com