是否可以确定某个进程是否是当前唯一使用SysV信号量的进程,然后以某种方式“锁定”该信号量,以便该进程可以在另一个进程再次请求访问之前安全地删除它?
发布于 2013-01-23 18:09:56
我会试着回答你的问题。如果我的回答不够准确,请随时编辑(或评论)我的答案。
首先,信号量大致是一个简单的整数值。当一个进程想要通过semop()函数使用它时,它有3个可能的目标:
信号量增加它的值(意味着它释放资源或向semaphore)
信号量本身并不包含有关在给定时间可能正在使用它的进程的任何信息。
然后,就没有办法建立一个系统范围的“锁定”机制:
根据semop()手册页,所有特权进程(被授予CAP_IPC_OWNER权限)都可以在信号量集上运行操作。此外,特权进程(包括IPC_RMID)可以使用所有semctl()命令。
这意味着您的代码必须为这种奇特的情况做好准备,并且必须处理由此产生的错误。例如,通过以特权用户身份运行ipcrm -s <sem_id here>命令,可以随时立即删除信号量集。
发布于 2013-01-29 20:42:14
int a;
if((a = semget(IPC_PRIVATE,1,0777|IPC_CREAT))==-1) { // get semaphore a
perror("\nFailed to create semaphore.");
exit(0);
}
if((semctl(a,0,IPC_RMID,0))==-1) { // Return semaphore a
perror("\nCan't RPC_RMID.");
exit(0);
}https://stackoverflow.com/questions/13187274
复制相似问题