10.4 例子:在Windows中删除文件
文件的删除提供了另一个例子,说明错误可以被定义掉。如果文件在一个进程中打开,Windows操作系统不允许删除该文件。对于开发人员和用户来说,这一直是受挫的根源。为了删除一个正在使用的文件,用户必须搜索系统以找到打开该文件的进程,然后杀死该进程。有时用户放弃并重新启动系统,只是为了删除文件。
Unix操作系统对文件删除的定义更加优雅。在Unix中,如果一个文件被删除时是打开的,Unix不会立即删除该文件。相反,它标记该文件为删除,然后删除操作成功返回。文件名已经从其目录中删除,所以没有其他进程可以打开旧文件,同名的新文件此时可以被创建,但现有的文件数据仍然存在。已经打开该文件的进程可以继续正常读取和写入该文件。一旦文件被所有的访问进程关闭,它的数据就被释放了。
Unix的方法定义了两种不同的错误。首先,如果文件目前正在使用中,删除操作不再返回错误;删除操作会成功,文件最终会被删除。第二,删除一个正在使用中的文件,不会为使用该文件的进程创建异常。解决这个问题的一种可能的方法是立即删除文件,并标记该文件的所有打开操作,使其失效;其他进程读取或写入被删除文件的任何尝试都会失败。然而,这种方法会给这些进程带来新的错误。相反,Unix允许它们继续正常地访问该文件;延迟文件的删除将错误定义为不存在的。
Unix 允许进程继续读取和写入注定失败的文件可能看起来很奇怪,但我从未遇到过这会导致严重问题的情况。对于开发人员和用户来说,Unix对文件删除的定义比Windows的定义要简单得多。
Last updated