是否有可能确定进程是否是当前唯一使用SysV信号量的进程,然后以某种方式“锁定”信号量,以便进程可以在另一个进程再次请求访问之前安全地删除它?
答案 0 :(得分:0)
我会尽力回答你的问题。如果我不够准确,请随时编辑(或评论)我的答案。
首先,信号量大致是一个简单的整数值。当一个进程想要通过semop()
函数使用它时,它有三个可能的目标:
信号量本身并不包含有关在给定时间可能使用它的进程的任何信息。
然后,没有办法在全系统范围内锁定"机制:
根据semop()
手册页,所有特权进程(授予功能CAP_IPC_OWNER
)都可以对信号量集执行操作。
此外,所有semctl()
命令都可用于特权进程(包括IPC_RMID
)。
这意味着您的代码必须准备好处理此类异常情况,并且必须处理由此产生的错误。例如,可以通过以特权用户身份运行ipcrm -s <sem_id here>
命令来立即删除所设置的信号量。
答案 1 :(得分:0)
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);
}