【发布时间】:2016-11-12 19:40:59
【问题描述】:
大多数文件系统使用锁定来处理并发读/写。但是,如果在读取调用之后,执行写入调用删除前一次读取调用之前的数据。
打开文件的指针是否已更新以反映现在较小文件的新开始?
【问题讨论】:
标签: unix concurrency operating-system filesystems system
大多数文件系统使用锁定来处理并发读/写。但是,如果在读取调用之后,执行写入调用删除前一次读取调用之前的数据。
打开文件的指针是否已更新以反映现在较小文件的新开始?
【问题讨论】:
标签: unix concurrency operating-system filesystems system
这个问题并不真正有效,因为您不能使用 write 系统调用删除数据。您可以使用 write(2) 系统调用覆盖数据,但不能删除数据。现在,您可以使用 truncate(2) 系统调用来截断文件。这会更改文件的大小(由 stat(2) 系统调用通过 st_size 字段报告),并且由更改的 st_size 报告的文件末尾之后的任何字节都将为零。您可以使用 truncate 系统调用通过请求大于当前大小的新大小来增加文件的大小。是否允许这样做是未定义的(根据 POSIX 规范),或者系统在收到大于文件当前大小的截断时会做什么。在许多文件系统上,它只会将文件的大小设置为请求的大小。
好的,还有一些概念。与每个打开的文件结构相关联的是一个文件偏移指针。尝试使用 read(2) 或 write(2) 系统调用读取或写入文件将使偏移指针前进读取或写入的字节数。如果你使用 open(2) 系统调用打开一个文件两次,你会得到两个文件描述符,每个文件描述符指向一个不同的打开文件结构,在这种情况下,一个 read(2) 或 write(2) 使用一个文件描述符不会更改其他文件描述符的文件偏移量。 (如果您使用 dup(2) 系统调用克隆文件描述符,那么您将获得第二个文件描述符,它指向相同的文件结构,然后通过一个文件描述符对文件结构进行更改,使用 read( 2)、write(2) 或 lseek(2) 系统调用将通过克隆的文件描述符反映出来。但这是一个附带问题,所以我现在就这个话题要说的就是这些。)
现在,如果您截断文件,这不会更改文件描述符中的文件偏移量。但是,如果读取,截断大小之后的任何字节都将为零。所以答案是文件偏移量指针在截断后不会更新,但是尝试读取超出文件截断大小的内容将返回全零。
【讨论】: