调用read系统调用的文件大于我的缓冲区将意味着缓冲区将只捕获文件的第一部分。再次尝试调用它将没有效果,它仍然只提供文件的第一部分。假设文件是1 GB,缓冲区是1024字节,那么我们只能访问大文件的前1024个字节,有没有办法在不增加缓冲区大小的情况下访问文件的其余部分呢?
当您打开此网站上的文件时,我找不到任何有关此内容的标志:https://linuxhint.com/list_of_linux_syscalls/#open-flags(除非我误解了描述)。
我最初认为当我第二次进行syscalled时,计算机会填充第二个1024字节(就像在C IIRC中一样)。实际上,我有一个大约1300 B的文本文件大小和512 B的缓冲区大小,所以在这种情况下调整大小对我来说不是问题,但我想知道一般情况下是如何处理的。
有没有其他的系统调用把文件分割成碎片或者把它变成类似流的对象?我知道有一个bash split命令。C和我的操作系统如何处理这样的文件?C有一个选项,一次吃一个文件,他们真的在下面使用了一个非常大的缓冲区吗?被迫将完整的文件复制到一个单独的缓冲区中感觉很浪费,如果没有其他选择,我会感到惊讶。
编辑:抱歉!原来系统调用没有问题,发生的事情是,我希望有一个空字节或其他一些特殊字符来表示文件的结束,我用它来检查什么时候我应该停止填充和打印我的缓冲区。并且将发生的是系统调用将仅改变直到缓冲器中的文件的结尾,所以当我打印出来的时候,它看起来像是在自己循环,最后我会看到它的一部分还没有完成,当在现实中,它确实完成了,但有一些重复的文本,从以前的缓冲区重填后。我正在阅读的书(Programming from the Ground Up)说系统调用还会在末尾添加一个\0,这样我就可以检查它了。它大约是32位汇编,所以系统调用可能已经改变了。[编辑2:现在我使用系统调用的返回值,它是系统在缓冲区中更改的文件长度,以便检查何时停止并打印而不重复前一个缓冲区的部分。
tl;dr -误解了系统调用
1条答案
按热度按时间z3yyvxxp1#
发生的事情是,我第一次误读了以下关于从编程从头开始阅读行,并不小心在我的脑海中用文件替换行:
举个例子,假设你想从一个文件中读入一行文本,但是你不知道这一行有多长。你可以简单地从文件中读入大量的字节/字符到一个缓冲区中,寻找行尾字符,并将所有字符复制到该行尾字符的另一个位置。如果你没有找到行尾字符,您将分配另一个缓冲区并继续阅读。在这种情况下,您可能会在缓冲区中留下一些字符,当您下次需要文件中的数据时,可以使用这些字符作为起点。
当在现实的几个段落之前,它说:
write系统调用将给予以%eax写入的字节数或错误代码。
没有提到任何关于空字节的东西。如果我读过这个程序,我也会意识到我的错误。或者如果我把我的缓冲区大小增加到比文件的大,我想。
对于我的代码中发生的事情:我希望有一个空字节或其他特殊字符来表示文件的结束,我用它来检查我应该在什么时候停止填充和打印我的缓冲区。系统调用只会改变,直到文件在缓冲区的结束,并留下相同的缓冲区的其余部分,所以当我打印它永远不会停止,在每次缓冲区写结束时,我会看到它的一部分没有完成,当在现实中,它确实完成了,但有一些重复的文本,从以前的缓冲区重填后。
从技术上讲,我现在意识到缓冲区只在最后重新填充一次,之后的读取根本不会改变缓冲区,我只是重写最后一个缓冲区,直到我停止程序。