我对Linux API sem_unlink()有点困惑,主要是在什么时候或为什么调用它。我在Windows中使用信号量已经很多年了。在Windows中,一旦关闭了命名信号量的最后一个句柄,系统就会删除底层内核对象。但是在Linux中,开发人员需要通过调用sem_unlink()来删除内核对象。如果不这样做,内核对象将保留在/dev/shm文件夹中。
我遇到的问题是,如果进程A调用sem_unlink(),而进程B锁定了信号量,它会立即销毁信号量,现在当进程C出现时,进程B不再受信号量的“保护”。更重要的是,手册页充其量也是令人困惑的:
“信号量名称将立即删除。一旦打开信号量的所有其他进程将其
我正在Linux中开发信号量。我想知道信号量值是否可以在初始化值之外增加?如果是的话,什么时候会发生这种情况?
例如,信号量值被初始化为1。如果我连续两次递增up(sem),信号量的值会增加超过1吗?
x(void){
sema_init(sem1, 1);
down(sem1);
{
.
. // some code implementation
.
}
up(sem1); // i understand this increment the value back to 1.
up(sem1);
/* what exactly does this statement
在我们的项目中,我们使用信号量在父进程和子进程之间进行同步。执行信号量操作,并在每次同步时删除信号量。
几周后,semop操作失败,出现“无效参数”
sembuf.sem_num = 0;
sembuf.sem_op = 1;
sembuf.sem_flg = SEM_UNDO;
ret = semop( semid, &sembuf, 1 ); --> invalid arguments couple of weeks later.
semid是正确的,我没有看到任何由于特定进程导致的信号量泄漏。
In man page i could see the possib