Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我可以使用代码从目录中删除文件,但不删除其inode吗?_Python_Macos_Directory_Inode_Lsof - Fatal编程技术网

Python 我可以使用代码从目录中删除文件,但不删除其inode吗?

Python 我可以使用代码从目录中删除文件,但不删除其inode吗?,python,macos,directory,inode,lsof,Python,Macos,Directory,Inode,Lsof,我对一个文件如何被删除(丢弃)但仍然被一个进程链接并被写入感到困惑。我的理解是,文件名是目录中指向inode的条目。inode是列出组成文件的逻辑块的数据结构。当文件被删除时,其目录条目将被删除,但数据和inode将保持不变。内核检查是否存在指向inode的任何其他链接,如果没有,则删除inode并回收内存。但是如何创建这样一个无名的文件呢?每当我打开一个文件并用python读写它时,它就存在于磁盘上。但当我在mac上发出此命令时: lsof +L1 我得到了300个文件的列表!根据我所读到的

我对一个文件如何被删除(丢弃)但仍然被一个进程链接并被写入感到困惑。我的理解是,文件名是目录中指向inode的条目。inode是列出组成文件的逻辑块的数据结构。当文件被删除时,其目录条目将被删除,但数据和inode将保持不变。内核检查是否存在指向inode的任何其他链接,如果没有,则删除inode并回收内存。但是如何创建这样一个无名的文件呢?每当我打开一个文件并用python读写它时,它就存在于磁盘上。但当我在mac上发出此命令时:

lsof +L1

我得到了300个文件的列表!根据我所读到的,这些文件只有一个链接,一个指向写入过程的链接。如果这些文件也有目录条目,那么至少会有两个链接。那么,在这个过程中的某个地方,写入这些文件的进程删除了它们的目录条目?为什么?如何打开?

打开一个文件,然后取消链接。现在您有了一个打开的文件描述符,该描述符指向一个目录中没有链接的文件

可以使用
unlink()
系统调用以编程方式取消文件链接。在命令行中,可以使用命令
rm
unlink
。这些实际上只是调用
unlink()
系统调用的一种方法

可能有许多这样的文件描述符,
lsof
向您显示,这是因为某个程序打开了一个文件,然后另一个程序替换了该文件。有几种方法可以写出一个文件。可以打开现有文件,截断其内容,然后写入新内容。您可以取消文件链接,然后打开/创建新文件并写入新内容。或者您可以写入一个单独的文件,以原子方式交换两个目录项,将新文件放在旧文件的位置,然后取消旧文件的链接(即使用
rename()
exchangedata()
系统调用)。后两种方法将使任何已打开的文件描述符指向旧文件的inode,即使它不再从目录链接


例如,在我的系统上,
lsof
显示许多打开到/private/var/folders/../mds/mdsDirectory.db的描述符。这可能与聚光灯有关。磁盘上有该文件的版本,但不具有相同的inode。所以,可能是某个东西在时间t0打开了它,另一个东西在时间t1写出了一个新版本,并取消了旧版本的链接,我在时间t2进行了检查。

打开一个文件,然后取消链接。现在您有了一个打开的文件描述符,该描述符指向一个目录中没有链接的文件

可以使用
unlink()
系统调用以编程方式取消文件链接。在命令行中,可以使用命令
rm
unlink
。这些实际上只是调用
unlink()
系统调用的一种方法

可能有许多这样的文件描述符,
lsof
向您显示,这是因为某个程序打开了一个文件,然后另一个程序替换了该文件。有几种方法可以写出一个文件。可以打开现有文件,截断其内容,然后写入新内容。您可以取消文件链接,然后打开/创建新文件并写入新内容。或者您可以写入一个单独的文件,以原子方式交换两个目录项,将新文件放在旧文件的位置,然后取消旧文件的链接(即使用
rename()
exchangedata()
系统调用)。后两种方法将使任何已打开的文件描述符指向旧文件的inode,即使它不再从目录链接


例如,在我的系统上,
lsof
显示许多打开到/private/var/folders/../mds/mdsDirectory.db的描述符。这可能与聚光灯有关。磁盘上有该文件的版本,但不具有相同的inode。所以,可能是某个东西在时间t0打开了它,另一个东西在时间t1写出了一个新版本,并取消了旧版本的链接,我在时间t2进行了检查。

打开一个文件,然后取消链接。现在您有了一个打开的文件描述符,该描述符指向一个目录中没有链接的文件

可以使用
unlink()
系统调用以编程方式取消文件链接。在命令行中,可以使用命令
rm
unlink
。这些实际上只是调用
unlink()
系统调用的一种方法

可能有许多这样的文件描述符,
lsof
向您显示,这是因为某个程序打开了一个文件,然后另一个程序替换了该文件。有几种方法可以写出一个文件。可以打开现有文件,截断其内容,然后写入新内容。您可以取消文件链接,然后打开/创建新文件并写入新内容。或者您可以写入一个单独的文件,以原子方式交换两个目录项,将新文件放在旧文件的位置,然后取消旧文件的链接(即使用
rename()
exchangedata()
系统调用)。后两种方法将使任何已打开的文件描述符指向旧文件的inode,即使它不再从目录链接


例如,在我的系统上,
lsof
显示许多打开到/private/var/folders/../mds/mdsDirectory.db的描述符。这可能与聚光灯有关。磁盘上有该文件的版本,但不具有相同的inode。所以,可能是某个东西在时间t0打开了它,另一个东西在时间t1写出了一个新版本,并取消了旧版本的链接,我在时间t2进行了检查。

打开一个文件,然后取消链接。现在您有了一个打开的文件描述符,该描述符指向一个目录中没有链接的文件

可以使用
unlink()
系统调用以编程方式取消文件链接。在命令行中,命令