问答题 文件系统通常提供了OPEN、CLOSE、READ、WRITE、CREATE、DELETE等文件操作系统调用,但是在使用DELETE系统调用时通常会返回“文件正在使用”的错误。如果用户需要这个DELETE操作不返回这样的错误(即只要这个文件存在就一定能删除的DELETE语义),那么DELETE系统调用应该怎样实现?
【正确答案】
【答案解析】这样的DELETE系统调用可以有两种实现方法:
(1)如果没有用户打开这个文件则按照一般的方法进行处理。如果发现有用户已经打开了文件,则立即向DELETE调用者返回成功信息。而对于已经打开文件的程序可以有两种实现方法:一种是在它们后续使用这个文件的系统调用中返回“文件已经删除”的错误;另一种是在这些进程的打开文件表中置入“文件已删除”的标记,当所有用户进程均关闭了这个文件之后删除这个文件。
(2)如果没有用户打开这个文件则按照一般的方法进行处理。如果发现有用户已经打开了文件,则阻塞DELETE的调用进程,等待所有打开待删除文件的用户进程均关闭了这个文件之后再删除这个文件,最后唤醒DELETE的调用进程继续执行。 [解析] 文件系统的实现(甚至操作系统的实现)是应用驱动的结果,没有一种语义是确定的,只是因为要保持一定的使用习惯(如题目中所给的错误就是一种约定)才采用目前的语义。但是如果特殊的应用要求特殊的接口,操作系统必须根据情况进行改进。
给出的解答方法实际上是异步和同步接口的问题。第1种方法采用的是异步语义接口;第2种方法采用的是同步语义接口。绝大多数的I/O接口都可以归结为异步和同步两类,只是大多数程序员更多地习惯使用同步接口。