创建锁的进程被杀死时,为什么不删除文件上的锁?

时间:2016-12-06 20:16:13

标签: c++ linux

我们有Socket Server,它使用/ tmp目录中的open()创建一个文件,并使用带有标志的flock()将其锁定LOCK_EX | LOCK_NB。我们将检查flock()的返回值,如果错误是EWOULDBLOCK,我们将退出Socket Server。如果返回值成功,我们将退出。这是为了确保始终只运行一个Socket服务器。

但我们观察到,当创建锁的进程被终止时,锁不会被删除。因此,后续尝试启动套接字服务器(当现有的Socket服务器进程死亡时)由于这个原因而失败。请问有什么可以让我知道为什么当创建锁的进程被杀死并且有什么方法可以解决这个问题时,文件上的锁没有被删除?

3 个答案:

答案 0 :(得分:2)

当您进行分叉时,子进程将继承文件描述符的副本。 关闭文件描述符的所有重复项之前,不会释放该锁定。

为避免此问题,子进程应在fork()返回之后关闭文件描述符。

如果每次您的fork()子代调用exec(),那么可以通过在open()标志参数中使用O_CLOEXEC来避免这种情况。当子进程调用exec()时,这将导致子进程的重复文件描述符自动关闭。有关O_CLOEXEC的更多信息,请参见“ man open”。

答案 1 :(得分:1)

因为当进程崩溃时你没有关闭文件描述符。 flock doc:https://linux.die.net/man/2/flock

  

通过对任何这些重复描述符的显式LOCK_UN操作释放锁,或者在所有这些描述符都已关闭时释放锁

解决方案是等待信号15(杀死)并做某事。 http://en.cppreference.com/w/cpp/utility/program/signal

或者可能将服务器作为线程运行,当它关闭或压缩关闭文件discriptor时(线程共享内存)。

答案 2 :(得分:0)

进程杀死时自动释放锁,我在Ubuntu21.04+GCC10.3.0上测试过。