|
|
1
47
事实证明,没有一种方法可以可靠地恢复信号量。当然,任何人都可以
注意ipc工具也可以使用——常用工具
和
谢谢你们的帮助,伙计们。 |
|
|
2
6
使用锁文件而不是信号量,很像@Stphane的解决方案,但没有flock()调用。您只需使用独占锁打开文件:
|
|
|
3
5
这是管理信号量时的典型问题。有些程序使用单个进程来管理信号量的初始化/删除。通常这个过程只做这个,其他什么都不做。您的其他应用程序可以等待信号量可用。我见过使用SYSV类型的API实现这一点,但没有使用POSIX。类似于 鸭子 '在semop()调用中使用SEM_UNDO标志。
|
|
|
4
2
您应该能够使用
啊,是的。。。
|
|
|
5
2
您需要再次检查,但我相信可以从信号处理程序调用sem_post。如果您能够捕捉到导致流程中断的某些情况,这可能会有所帮助。 与互斥不同,任何进程或线程(具有权限)都可以发布到信号量。您可以编写一个简单的实用程序来重置它。大概你知道你的系统什么时候死锁了。您可以将其关闭并运行实用程序。
SysV信号量更适合这种情况。您可以指定SEM_UNDO,在该命令中,如果进程死亡,系统将撤销对该信号量所做的更改。它们还可以告诉您更改信号量的最后一个进程id。 |
|
6
1
如果进程被终止,那么就没有任何直接的方法来确定它是否消失了。 您可以对您使用的所有信号量进行某种定期的完整性检查 semctl (cmd=GETPID)查找在您描述的状态下触及每个信号量的最后一个进程的PID,然后检查该进程是否仍然存在。如果没有,则进行清理。 |
|
|
7
0
如果使用命名的信号量,那么可以使用与中使用的算法类似的算法
考虑这些因素:
2.每个进程在linux中都有一个map_文件,路径如下:
这些映射文件显示了进程内存映射到哪个部分!
2-迭代所有进程以查找其符号链接标记集与命名信号量的完整路径匹配的映射文件。如果有,则该信号量处于实际使用中,但如果没有,则可以安全地取消命名信号量的链接,并重新打开它以供使用。
在步骤2中,当迭代所有进程时,而不是迭代文件夹中的所有文件
|
|
|
8
-1
简单地做一个
|
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
MysteryMoose · GCC下故意忽略初始化器警告中的过量元素 1 年前 |
|
|
Ken P · 如何利用[*]printf格式类型规范警告? 1 年前 |
|
fghoussen · 在C结构体中,为什么打包、对齐似乎会进行填充? 1 年前 |
|
|
adversarr · 全局变量何时导出到可执行文件? 1 年前 |