【问题标题】:data deletion with concurrent reading/writing in file system文件系统中并发读/写的数据删除
【发布时间】:2016-11-12 19:40:59
【问题描述】:

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

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

【问题讨论】:

    标签: unix concurrency operating-system filesystems system


    【解决方案1】:

    这个问题并不真正有效,因为您不能使用 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) 系统调用将通过克隆的文件描述符反映出来。但这是一个附带问题,所以我现在就这个话题要说的就是这些。)

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

    【讨论】:

    • 感谢您的建议。因此,要更新文件描述符的偏移量,我只需 dup2 它,然后将该 dup'ed fd 的文件偏移量定向到我想要的位置。有没有办法在 unix 中访问文件描述符表?
    • 截断不起作用 - 我想删除之前读取调用的文件偏移量之前的数据。
    • 我刚刚连接了这样一个事实,即您也是提出“在系统级别从文件中擦除已读取数据”问题的人。无意冒犯,但你真的在这棵树上叫错了树……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2020-11-03
    相关资源
    最近更新 更多