繁体   English   中英

C信号灯:sem_wait引发莫名其妙的错误

[英]C semaphores: sem_wait throwing inexplicable error

我正在研究一个必须使用信号量来解决的问题。 我有包含两个信号量,阵列gsem ,和给定的特定条件下调用sem_wait(&(gsem[me]))这是为了等待,直到该特定的过程被唤醒。 但是,由于某种原因,它给我错误的错误Bad file descriptor 我查找了sem_wait ,Open Group规范说这不是sem_wait可能导致的错误。 这使我的整个程序变得疯狂,我不知道为什么会失败。

编辑:违反要求的代码。

120     sem_wait(&mutex);
121     if (inside[opp] > 0 || waiting[opp] > 0) {
122         sem_wait(&screen);
123         printf("%s %u waiting\n", names[me], t);
124         sem_post(&screen);
125         waiting[me]++;
126         sem_post(&mutex);
127         int hg = sem_wait(&(gsem[me]));
128         if (hg < 0)
129             printf("%s\n", strerror(errno));
130     } 

我应该注意,这是一项作业,我们需要使用信号量。 教授称其为“男女皆宜的浴室”。 男人和女人都可以使用它,但不能同时使用。 inside[opp]是洗手间中异性的人数。 waiting[opp]是等待使用它的异性的数量。 screen是一个信号灯,用于锁定对stdout访问。 该解决方案基于对我们的教科书中使用传递指挥棒的读者/作家问题的解决方案。

我还应该注意,我们首先必须在Ada中编写一个解决方案,然后将其转换为C。我的Ada解决方案有效,并且我逐字翻译了它。 我确定这只是一些语法上的细节。 最后,如果有帮助,我正在研究Snow Leopard。

请记住,根据您的情况,Single UNIX Spec不一定是控制文档。 当然,可能应该如此,但是由于您实际上尚未指定平台,因此可能是您所处的环境决定遵循不同的规则和/或具有其他返回码。

需要检查的几件事。

1 /您确定 sem_wait返回-1吗? 我已经看到编码人员只是在通话后检查errno ,却没有意识到大多数通话不会在成功后将其设置为零,而是只是将其搁置一旁。 如果在sem_wait调用之前errno设置为EBADF 则可能会出现这种情况。

2 /您是否在创建信号量时遵循了所有规则,例如对其进行初始化?

3 /您是指有效的信号量吗? 首先,您确定me索引没有超出范围吗?

缺少一些代码,这就是我必须提供的所有建议。


有一两件事,我发现有一个粗略的谷歌sem_wait ebadf在这里 原来这是在线程环境中使用errno而不包含正确的标头的问题。

这样,将使用全局errno ,而不是使用正确的线程 (后者将提供特定于线程的errno )。

不管是您的问题,我不知道,但是可能值得研究。


沿着这条消息链走得更近一些,还有其他可能性。

4 /您是否正在使用sem_init初始化信号量。 如果是这样,请检查其返回值。 该消息来自2008年,因此可能是过时的信息,但是OSX可能仍不支持sem_init ,而更喜欢sem_open (请参见此处 )。 您确实应该检查所有 sem_函数的返回码,以便确定(如果您对所有函数都使用sem_init (并且不支持),并且仅检查其中一个,则可能会发现它们失败了)。

5 /在OSX ,线程errno函数链中存在(曾经是) 竞争状态 ,在调用errno (在主线程中,在其他线程中使用current_thread->errno )之前,调用另一个库的__error函数调用pthread_self 从技术上讲,这是不允许的,并且有一个很小的窗口,可能会发生问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM