数据删除与文件系统中的并发读/写

时间:2016-07-10 22:46:55

标签: unix concurrency operating-system filesystems system

大多数文件系统使用锁定来处理并发读/写。但是,如果在读取调用之后执行写入调用,删除先前读取调用之前的数据,该怎么办呢?

打开阅读文件的指针是否已更新以反映现在较小文件的新开头?

1 个答案:

答案 0 :(得分:1)

问题并不真正有效,因为您无法使用write系统调用删除数据。您可以使用write(2)系统调用覆盖数据,但不能删除数据。现在,您可以使用truncate(2)系统调用截断文件。这会更改文件的大小(通过stat(2)系统调用通过st_size字段报告),并且由更改的st_size报告的文件结尾之后的任何字节都将为零。您可以通过请求大于当前大小的新大小来使用truncate系统调用来增加文件的大小。未定义(根据POSIX规范)是否允许这样做,或者当它收到大于文件当前大小的截断时系统将执行的操作。在许多文件系统上,它只是将文件大小设置为请求的大小。

好的,还有一些概念。与每个打开的文件结构相关联的是文件偏移指针。尝试使用read(2)或write(2)系统调用读取或写入文件将使偏移指针前进读取或写入的字节数。如果使用open(2)系统调用打开文件两次,您将获得两个文件描述符,每个描述符引用不同的打开文件结构,在这种情况下,使用一个文件读取(2)或写入(2) descriptor不会更改其他文件描述符的文件偏移量。 (如果使用dup(2)系统调用克隆文件描述符,那么您将获得指向相同文件结构的第二个文件描述符,然后使用read(通过一个文件描述符对文件结构进行更改)( 2),write(2)或lseek(2)系统调用将通过克隆文件描述符反映出来。但这是一个副问题,所以我现在就这个主题就说了。)

现在,如果截断文件,则不会更改文件描述符中的文件偏移量。但是,如果读取,截断大小后的任何字节都将为零。所以答案是文件偏移指针在截断后不会被更新,但尝试读取超出文件的截断大小将返回全零。