【问题标题】:Semop returns identifier removedSemop 返回标识符已删除
【发布时间】:2015-01-16 15:51:57
【问题描述】:

我正在创建一个具有共享内存段和锁定它的信号量和信号处理程序的多进程应用程序。

每当我锁定和解锁我的信号量时,一切都很好,只要它在我的主程序(或其中一个子程序)中。

当我在信号处理程序中时会出现问题。在那里我锁定信号量,对共享内存段进行一些更新并解锁它。

我有一个struct sembuf,我们称之为sb

我的锁码

void semLock(){
sb.sem_op=-1;
semop(sID,sb,sizeof(sb);
}

我的解锁码

void semUnlock(){
sb.sem_op=1;
semop(sID,sb,sizeof(sb);
}

以及我的工作方式

void signalHandler(int segnum){
semLock();
//do some stuff
semUnlock();
}

没有真正的原因为什么这不起作用,因为sID 是全局的,并且继承给父进程创建的所有子进程,并且当子进程运行其他锁定和解锁信号量的代码时。

我认为问题在于这是在信号处理程序内部,但我不明白为什么。 在终端打印的错误是

semop failed identifier removed

我尝试用谷歌搜索错误,但没有找到任何有意义或相关的信息来说明可能导致错误的原因。

编辑 当我创建sb 时,它使用{0,-1,0} 初始化 我的 ipcs 中只有一个信号量

【问题讨论】:

  • 为什么不用互斥锁?
  • @NTN 我以前从未见过他们,但这是大学作业的一部分,所以我们必须使用我们所教的内容。
  • 嗯,是的,它们可能会更好,但我不允许使用它们,因为这是大学作业的一部分
  • 信号量的初始值为1,所以或多或少是一样的

标签: c multiprocessing ipc semaphore


【解决方案1】:

事实证明,在我的代码中某处我丢失了信号量 ID,semLock 和 semUnlock 试图锁定和解锁错误的 ID,它们返回错误

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 2020-02-18
    • 2012-09-11
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2022-08-03
    相关资源
    最近更新 更多