Linux 删除正在进行I/O的文件:它是文件系统和/或操作系统功能?

Linux 删除正在进行I/O的文件:它是文件系统和/或操作系统功能?,linux,windows,io,operating-system,filesystems,Linux,Windows,Io,Operating System,Filesystems,我正在编写一个shell脚本,它将在Linux上运行,但可以在挂载分区上的文件上运行 可能有也可能没有ext*文件系统。它可以是NTFS、FAT32或任何基于索引节点或非索引节点的系统 这可能会被进一步重新安装到运行非Linux操作系统(如Windows或Mac)的其他设备上 此外,我的脚本需要能够通过运行在Linux、Windows或Mac机器上的远程进程删除此共享、任意格式分区上的文件(即使文件正在读取或写入) 问题: 能够删除正在使用的文件的功能是 a。只有文件系统 b。或者,只有操作系统

我正在编写一个shell脚本,它将在Linux上运行,但可以在挂载分区上的文件上运行

  • 可能有也可能没有ext*文件系统。它可以是NTFS、FAT32或任何基于索引节点或非索引节点的系统

  • 这可能会被进一步重新安装到运行非Linux操作系统(如Windows或Mac)的其他设备上

  • 此外,我的脚本需要能够通过运行在Linux、Windows或Mac机器上的远程进程删除此共享、任意格式分区上的文件(即使文件正在读取或写入)

    问题:

  • 能够删除正在使用的文件的功能是

    a。只有文件系统

    b。或者,只有操作系统

    c。还是两者兼而有之

  • (Q1的扩展名)对文件执行I/O的进程和删除文件的进程都是本地的还是远程的,这有关系吗


  • 这取决于如何定义文件系统和操作系统。通常,我了解文件系统下的数据存储在设备上的组织方式。然后,操作系统负责数据和文件的I/O。特别是,如果您的脚本想要删除一个文件,它会调用诸如rm之类的实用程序并提供文件名。此实用程序是一个进行适当系统调用的程序。此系统调用是在特权模式下执行的操作系统的一部分。它实现了做什么和如何做(例如,应该使用哪些驱动程序将特定驱动器上的HDD块标记为空闲,或者应该调用一些远程过程,或者涉及samba服务器等) 所以,为了回答你的问题1,我倾向于回答b

    如果进程对文件和 删除文件是本地的还是远程的

    有趣-远程系统如何在windowsdirect上访问文件(打开、读写数据、删除)?真的不可能。我们需要一些在本地系统中运行的代理(LANMan服务器),这些代理将通过远程命令(send say by)对文件执行本地操作。因此,从文件系统视图-所有操作始终本地

    能够删除正在使用的文件是的功能吗

    这当然是由文件系统驱动程序实现的,但是这个驱动程序是为具体的操作系统编写的,并且基于it规则。虽然磁盘上的文件系统数据具有通用格式(结果是驱动器在一个操作系统中格式化(和写入的文件),可以从另一个操作系统读取)-文件系统驱动程序如何处理请求、打开、读取、写入和删除文件-这是操作系统特有的。不同的操作系统有不同的功能。基于it规则。所以磁盘上的数据格式是通用的,并且只依赖于文件系统。但是如何读取/写入/删除这些数据——已经是操作系统特有的了

    在windows中,我们可以删除文件:

    通常,标记为删除的文件在所有 文件的打开句柄已关闭,并且 文件为零。使用将文件标记为删除时 文件\u处置\u POSIX\u语义,链接将从 一旦POSIX删除句柄关闭,名称空间就可见, 但该文件的数据流仍然可以被其他现有用户访问 直到最后一个句柄关闭为止

    所以在一般情况下,文件不会被删除,直到最后一个句柄被关闭。尝试删除文件后,文件变得不可访问-无法再打开它(我们收到错误消息,请求对文件对象执行非关闭操作,删除挂起。如果尝试执行此操作,则在文件标记为删除后)。但如果文件已经打开,我们仍然可以通过这个句柄处理它。此外,如果文件上存在节,则无法删除文件-如果试图删除无法删除的文件或目录,则会出现错误

    从win10开始redstone1 build exist
    FILE\u DISPOSITION\u POSIX\u SEMANTICS
    标志,该标志允许在删除句柄关闭时从可见命名空间中删除文件名,但在关闭最后一个句柄之前,其他现有句柄仍可以访问文件的数据流

    windows代码测试演示:(
    FILE\u DISPOSITION\u POSIX\u SEMANTICS
    受ntfs支持的仅从
    \u WIN32\u WINNT\u WIN10\u RS1
    开始
    FileDispositionInfoEx
    也支持的信息类仅从
    \u WIN32\u WINNT\u WIN10\u RS1
    开始。在以前的构建中,我们只是没有实现错误)

    和输出

    OpenFile=c0000056
    A non close operation has been requested of a file object with a delete pending.
    
    ReadFile=OK
    OpenFile=c0000034
    Object Name not found.
    
    CreateFile OK
    ReadFile=OK
    

    我初步的理解是,这是1c。但不确定,100%。在你的问题中,你谈到了删除文件的能力。在一天结束时,本地驱动程序将删除该文件(该文件所在的物理驱动程序的本地)。司机肯定能做到。如果将驱动程序视为文件系统的一部分,则回答C。好的。我认为它是操作系统的一部分。但是回到能力上来。如果从用户的角度考虑这种情况,它将删除用户(或脚本)将被从用户的本地主机中考虑的文件的能力。在这种情况下,给用户的反馈将来自作为操作系统的操作系统。本地驱动程序的功能始终可以删除文件。操作系统需要判断文件是否可以删除。这取决于用户访问权限、远程主机的可用性等。“在一天结束时,文件将被删除”-而不是某些OS+fs组合在使用时锁定文件并阻止其删除。我的问题还有开发和测试方面:如果答案是1a,我只需要测试/研究各种文件系统。如果答案是1b,那么只有三个操作系统,如果答案是1c,那么(恶心!)我必须担心各种组合。用户权限和远程主机可用性您现在可以忽略。目前我不关心它们。有一个名为unlink的系统调用。此系统调用负责删除文件。一旦它被称为“福”
    OpenFile=c0000056
    A non close operation has been requested of a file object with a delete pending.
    
    ReadFile=OK
    OpenFile=c0000034
    Object Name not found.
    
    CreateFile OK
    ReadFile=OK