【发布时间】:2017-12-12 22:34:04
【问题描述】:
最近我遇到了这个练习:
鉴于 Linux C 语言程序中的系统调用序列:
fd = open("f123", O_RDWRT | O_CREAT, 0777);
lseek(fd, 0x1000000L, 0);
write(fd, &fd, sizeof(int));
绘制被这些操作修改的文件系统数据结构和磁盘块,考虑 4 KB 的块大小和 4 字节的索引块指针。
对于第一个系统调用 (open),我意识到它是如何工作的,并以这种方式对其进行了模式化:
现在,跳过 draw 部分(我意识到这很难回答),我想了解 lseek 和 write 在 inode 和索引块方面的工作原理(不管它们是什么)。
我试图确定lseek 计算了正确的 inode(因为块大小是已知的),但仍然不知道它是如何工作的。
【问题讨论】:
-
open()确定 inode — 其他函数使用该信息。您需要一个打开的文件描述符表和一个打开的文件描述表(这可能是您所说的“文件表”,但我不确定)。描述(与描述符相反)保存查找偏移量(文件中的当前位置)。一般来说,多个描述符可以引用一个描述——这些描述符不必都在同一个进程中,尽管在您的示例代码中,只涉及一个进程。 -
有道理。所以 lseek 只是改变了描述表中的当前偏移量,然后搜索正确的块(如果有的话)?
-
lseek()不搜索正确的块;它不需要。这是下一个 I/O 操作——与移动操作相反——需要跟踪块。例如,您可以寻找超出当前文件结尾的方法。接下来会发生什么取决于您是读取(EOF)还是写入(写入新材料,并且任何跳过的块都被视为所有字节为零;包含当前EOF的最后一个块的尾部和当前块的开头可能需要被强制归零)。您不能从一开始就使用负偏移量,否则,lseek()会成功(受类型限制)。
标签: c linux filesystems system-calls