[英]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.