SysV信号量去除

时间:2012-11-01 23:52:28

标签: c semaphore

是否有可能确定进程是否是当前唯一使用SysV信号量的进程,然后以某种方式“锁定”信号量,以便进程可以在另一个进程再次请求访问之前安全地删除它?

2 个答案:

答案 0 :(得分:0)

我会尽力回答你的问题。如果我不够准确,请随时编辑(或评论)我的答案。


首先,信号量大致是一个简单的整数值。当一个进程想要通过semop()函数使用它时,它有三个可能的目标:

  • 增加其值(意味着它向信号量释放或添加资源)
  • 降低其值(意味着它从信号量中抓取或删除一些资源)
  • 等待信号量取值0

信号量本身并不包含有关在给定时间可能使用它的进程的任何信息。

然后,没有办法在全系统范围内锁定"机制:

根据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);                                                                                
    }
相关问题