【发布时间】:2012-10-22 15:25:05
【问题描述】:
是否可以确定一个进程是否是当前唯一使用 SysV 信号量的进程,然后以某种方式“锁定”该信号量,以便该进程可以在另一个进程再次请求访问之前安全地删除它?
【问题讨论】:
-
我认为你需要一个倒计时锁,而不是信号量。
是否可以确定一个进程是否是当前唯一使用 SysV 信号量的进程,然后以某种方式“锁定”该信号量,以便该进程可以在另一个进程再次请求访问之前安全地删除它?
【问题讨论】:
我会尽力回答你的问题。如果我不够准确,请随时编辑(或评论)我的答案。
首先,信号量大致是一个简单的整数值。当一个进程想通过semop()函数使用它时,它有3个可能的目标:
信号量本身不包含任何有关在给定时间可能正在使用它的进程的信息。
那么,就没有办法建立系统范围的“锁定”机制了:
根据semop() 手册页,所有特权进程(被授予CAP_IPC_OWNER 能力)都可以在信号量集上运行操作。
此外,所有semctl() 命令都可用于特权进程(包括IPC_RMID)。
这意味着您的代码必须为这种特殊情况做好准备,并且必须处理由此产生的错误。例如,可以通过以特权用户身份运行ipcrm -s <sem_id here> 命令随时立即删除信号量集。
【讨论】:
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);
}
【讨论】: