Chinaunix

标题: 关于semop异常的问题 [打印本页]

作者: chenshko    时间: 2014-06-24 11:09
标题: 关于semop异常的问题
int sem_v_wait(int semid)
{
    struct sembuf sops = {0, -1, SEM_UNDO};

    return (semop(semid, &sops, 1));
}

int sem_wait_zero(int semid)
{
    struct sembuf sops = {0, 0, 0};

    return semop(semid, &sops, 1);
}

sem_wait_zero这个函数是当semid的value值为0时程序才会向下继续执行,否则睡觉等待。
可是我的程序运行一段时间后,在semid的value值为1的情况下,程序异常执行了,更加怪异的是每次都是value到34时在此挂起睡觉,不知道是什么原因。
然后在通过34次触发调用sem_v_wait函数,当semid的value值重新回到0时, 又回归正常状态,并且就不再出现这种问题。
还有我发现一个情况无论是否正常状态sem_wait_zero的返回值都是1,应该说明semop调用本身没什么问题。

怀疑semop受到了其他信号量的影响,那位大神有遇到这种情况,如何解决。

作者: qxhgd    时间: 2014-06-24 12:07
是否有完整代码?
作者: chenshko    时间: 2014-06-24 14:19
完整代码太多了,没法贴出来回复 2# qxhgd


   
作者: chenshko    时间: 2014-06-27 10:51
问题解决了,semop返回-1,错误为ENITR.该进程能够捕获到SIGCHLD信号,没有好的解决办法,只是通过错误处理重新调用semop




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2