我们有 Socket Server,它使用 open() 在/tmp 目录中创建一个文件,并使用带有 LOCK_EX | 标志的 flock() 锁定它。锁定_NB。我们将检查flock()的返回值,如果错误是EWOULDBLOCK,则我们将从Socket服务器退出。如果返回值是成功,我们就退出。这是为了确保只有一个 Socket 服务器始终运行。
但是我们观察到,当创建锁的进程被终止时,文件上的锁并没有被删除。因此,后续尝试启动 Socket 服务器(当现有 Socket 服务器进程终止时)将由于这个原因而失败。任何人都可以告诉我为什么当创建锁的进程被杀死时文件上的锁没有被删除,有什么方法可以解决这个问题吗?
最佳答案
当您 fork 时,子进程会继承文件描述符的拷贝。 在文件描述符的所有重复项都关闭之前,锁不会被释放。
为了避免这个问题,子进程应该在 fork() 返回后关闭文件描述符。
如果每次 fork() 时子进程都会调用 exec(),那么您可以通过在 open() 标志参数中使用 O_CLOEXEC 来避免这种情况。这将导致子进程调用 exec() 时自动关闭子进程的重复文件描述符。有关 O_CLOEXEC 的更多信息,请参阅“man open”。
关于c++ - 为什么当创建锁的进程被杀死时,文件上的锁没有被删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41004061/