理解Linux中的read()

理解Linux中的read(),linux,file,posix,system-calls,Linux,File,Posix,System Calls,我正在阅读手册页(int-fd、void*buf、size\u t count) 在这里,我需要对“在支持查找的文件上,读取操作从当前文件偏移量开始,文件偏移量按读取的字节数递增”一词进行更多解释 1) 如果我不想从头开始读取文件,比如说从偏移量100(字节)读取1字节,偏移量100是否添加到fd,即读取(fd+100,buf,1)?如果没有,如何在代码中指定偏移量 2) 如何知道“文件支持查找”?我通过spi总线“打开”FPGA作为spi设备,以获得fd。我正在使用read()读取FPGA的

我正在阅读手册页(int-fd、void*buf、size\u t count)

在这里,我需要对“在支持查找的文件上,读取操作从当前文件偏移量开始,文件偏移量按读取的字节数递增”一词进行更多解释

1) 如果我不想从头开始读取文件,比如说从偏移量100(字节)读取1字节,偏移量100是否添加到fd,即读取(fd+100,buf,1)?如果没有,如何在代码中指定偏移量

2) 如何知道“文件支持查找”?我通过spi总线“打开”FPGA作为spi设备,以获得fd。我正在使用read()读取FPGA的寄存器。在这种情况下,文件支持是否正在查找


谢谢

您需要首先通过读取或查找调用将文件指针(当前文件偏移量)移动到100。

您需要首先通过读取或查找调用将文件指针(当前文件偏移量)移动到100。

您需要首先通过读取或查找调用将文件指针(当前文件偏移量)移动到100。

您需要首先移动文件指针(当前文件偏移量)到100,通过读取或查找调用。

用于移动文件中的位置,因此可以执行以下操作

lseek(fd, 100, SEEK_SET);
read(fd, buffer, 1);
在位置100处读取一个字节

然而,虽然这是一个有效的例子,但我建议不要以这种方式读取文件中的单个字节,因为它非常慢/昂贵

如果您想使随机io按比例获取文件中的单个字节,那么最好使用
mmap
而不是
lseek/read

来移动文件中的位置,因此您可以执行以下操作

lseek(fd, 100, SEEK_SET);
read(fd, buffer, 1);
在位置100处读取一个字节

然而,虽然这是一个有效的例子,但我建议不要以这种方式读取文件中的单个字节,因为它非常慢/昂贵

如果您想使随机io按比例获取文件中的单个字节,那么最好使用
mmap
而不是
lseek/read

来移动文件中的位置,因此您可以执行以下操作

lseek(fd, 100, SEEK_SET);
read(fd, buffer, 1);
在位置100处读取一个字节

然而,虽然这是一个有效的例子,但我建议不要以这种方式读取文件中的单个字节,因为它非常慢/昂贵

如果您想使随机io按比例获取文件中的单个字节,那么最好使用
mmap
而不是
lseek/read

来移动文件中的位置,因此您可以执行以下操作

lseek(fd, 100, SEEK_SET);
read(fd, buffer, 1);
在位置100处读取一个字节

然而,虽然这是一个有效的例子,但我建议不要以这种方式读取文件中的单个字节,因为它非常慢/昂贵


如果您想使随机io按比例获取文件中的单个字节,您最好使用
mmap
而不是
lseek/read

或者您可能感兴趣,具体取决于您正在做什么。
pread
相当于原子(1)保存当前偏移量,(2)读取要读取的偏移量,(3)恢复原始偏移量


关于第二个问题,您将知道它是否是可查找的设备,因为您对
lseek
的调用将失败。我不知道有什么可靠的方法可以提前知道。

或者您可能会感兴趣,这取决于您正在做什么。
pread
相当于原子(1)保存当前偏移量,(2)读取要读取的偏移量,(3)恢复原始偏移量


关于第二个问题,您将知道它是否是可查找的设备,因为您对
lseek
的调用将失败。我不知道有什么可靠的方法可以提前知道。

或者您可能会感兴趣,这取决于您正在做什么。
pread
相当于原子(1)保存当前偏移量,(2)读取要读取的偏移量,(3)恢复原始偏移量


关于第二个问题,您将知道它是否是可查找的设备,因为您对
lseek
的调用将失败。我不知道有什么可靠的方法可以提前知道。

或者您可能会感兴趣,这取决于您正在做什么。
pread
相当于原子(1)保存当前偏移量,(2)读取要读取的偏移量,(3)恢复原始偏移量


在你的第二个问题上,你会知道它是否是一个可查找的设备,因为你对
lseek
的调用将失败。我不知道有什么可靠的方法可以提前知道。

你提到的“文件指针”与文件描述符fd相同吗?你的意思是我先读取(fd,buf,100),然后读取(fd,buf,1)?谢谢!不,文件指针是打开的文件中的内部定位器。打开时它的初始位置通常为0。尝试使用seek调用(如果使用文件指针而不是文件描述符,则使用fseek)打开文件后。这样,您实际上不必花费周期将前100个字节移动到缓冲区,只需将文件中的指针移动到所需的位置即可。您可以读取100个字节以移动文件指针,然后读取1,但只要“文件”就可以更干净、更简单地查找以某种方式支持随机访问。谢谢。原来我的文件不支持seek。在我使用pread时返回了错误29(非法seek)。那么在这种情况下,我是否必须读取()100字节才能移动偏移量,然后读取()呢1字节?这是唯一的方法吗?如果这个伪设备真的只支持顺序操作,而不支持随机访问查找,那么听起来这是唯一的方法。至少,看看这种方法是否有效。你确定你实际上没有查找结束(超过“EOF”)?你确定你甚至正确打开了文件/伪设备进行读取(并且权限允许读取)?别忘了检查这些东西。您提到的“文件指针”与文件描述符fd相同吗?您的意思是我先读取(fd,buf,100),然后读取(fd,buf,1)?谢谢!不,是文件poi