0

我使用以下命令来确定是否打开了文件描述符:

/usr/sbin/lsof -a -c sqlplus -u ${USER} | grep -l "${FILE_NAME}”

如果不是,我执行一些操作。该文件是一个假脱机的日志sqlplus

有时lsof告诉文件描述符没有打开,但后来我在这个文件中找到了一些新数据。它很少发生,所以我无法重现它。

  1. 可能是什么原因?
  2. sql spool 是如何工作的?它是从 SPOOL 文件命令保持打开文件描述符直到 SPOOL OFF 命令,还是多次打开和关闭文件描述符?
4

1 回答 1

0

你可能有一个“竞争条件”。Sqlplus 打开文件,将一些新数据放入其中,并在 lsof 检查文件和使用 lsof 的结果处理文件之间将其关闭。

通常,在文件系统中避免竞争条件的最佳方法是在处理相关文件之前对其进行重命名。重命名是一种相对便宜的操作,这会阻止其他进程在您的进程处理文件时打开/修改文件。您需要确保如果文件在重命名时在另一个进程中打开,则在您的进程处理它之前,您需要等到不再通过打开的文件句柄访问它。

大多数程序员编写的代码都充斥着竞争条件。这些会导致各种无法重现的错误。如果您记住几乎所有程序都有多个共享资源的进程并且必须始终管理共享,那么您将成为一个更好的程序员。

于 2013-04-23T13:00:18.393 回答