3

Is it possible to determine if a process is the only one currently utilizing a SysV semaphore and then somehow "lock" the semaphore so that the process may safely remove it before another process requests access again?

4

2 回答 2

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);                                                                                
    }
于 2013-01-29T12:42:13.523 回答
0

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


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

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

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

然后,没有办法建立系统范围的“锁定”机制:

根据semop()手册页,所有特权进程(被授予能力CAP_IPC_OWNER)都可以在信号量集上运行操作。此外,所有semctl()命令都可用于特权进程(包括IPC_RMID)。

这意味着您的代码必须为这种特殊情况做好准备,并且必须处理由此产生的错误。例如,可以通过ipcrm -s <sem_id here>以特权用户身份运行命令,随时立即删除信号量集。

于 2013-01-23T10:09:56.380 回答