8

我的问题是,当一个进程异常终止时(通过信号,它可能是 SIGKILL 所以我们无法拦截它),是否有任何保证释放其资源的顺序或原子性?特别是,我对文件锁和共享内存感兴趣。

例如:

1)如果进程持有 2 个文件的锁并异常终止,那么另一个试图锁定相同文件的进程是否有可能看到一个文件被锁定而另一个文件被解锁?还是从其他进程的角度来看,释放文件锁的过程是原子的?

如果它不是原子的,是否至少有一个预定义的顺序,文件锁将被终止进程释放(例如,以它们最初被锁定的相反顺序)?

2)我想使用文件锁来确保正确的共享内存初始化 - 映射到共享内存的进程将持有共享锁,并且想要映射到同一共享内存段的新进程将尝试测试该锁以查看是否需要执行初始化(如果需要,我可以稍后提供更多详细信息)。

然而,同样的问题出现在这里:如果一个持有文件锁并映射到共享内存段的进程异常终止,是否有可能在共享内存自动取消映射后,另一个进程仍然会看到文件锁被锁定?还是从其他进程的角度来看,共享内存段的取消映射和文件解锁是原子的?

4

2 回答 2

0

正如您的问题所暗示的那样,这取决于发送到程序的终止信号。AFIK 实际上只有 KILL (即kill -kill)会终止进程,而不会让进程有机会正确关闭自己。其他信号如 TERM 或 SIGINT可以被程序本身挂钩,要么被忽略,要么用于启动一些干净的关闭过程。想像 SIGHUP 这样的最温和的信号不会做任何事情,除非代码中有明确的钩子。因此,我不知道您关于文件锁的问题的具体答案,但请考虑这样一个事实,kill -kill即您可能真正担心的是这里。

于 2013-11-09T01:05:23.053 回答
0

不,释放资源没有顺序。只有肯定的是,在进程终止后会释放锁。

据我了解您的问题,您持有两个或多个相互关联的“锁”。不知何故,您的应用程序取决于锁的确切释放顺序。在不了解您的问题的详细信息的情况下,这似乎只是糟糕的设计

如果文件的锁依赖于共享内存的锁,则应以编程方式实现此依赖关系。

另一种解决方案是等待例如 100 毫秒,检查第二个锁。因为你可以假设,被终止进程的所有锁都会在很短的时间内被释放。如果您新启动的应用程序可以获取第一个锁,它将首先等待 100 毫秒,然后再尝试获取文件锁(或相反)。如果进程在此时终止,这将自动避免任何竞争条件。

于 2014-03-03T09:39:04.157 回答