2010-05-02 48 views
1

我正在处理一个我们必须使用信号量来解决的问题。我有一个数组,其中包含两个信号灯gsem,并且给定某些条件请求sem_wait(&(gsem[me])),它应该等待,直到该特定进程被唤醒。但是,由于某种原因,它给了我错误Bad file descriptor。我抬头看看sem_wait和Open Group规范说这不是错误sem_wait可能导致。这让我的整个程序变得疯狂,我不知道为什么这是失败的。C信号量: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的信号量。该解决方案基于对我们的教科书中提供的读者/作者问题的解决方案,该解决方案使用传递接力棒。

我也应该注意到,我们首先必须代码阿达的解决方案,然后将其转换为C.我的Ada解决方案的工作,我把它翻译逐字。我相信这是一些小的语法细节。最后,我正在研究Snow Leopard,如果有帮助的话。

+1

显示:-)好了,还是有问题的代码的最小版本的代码。 – paxdiablo 2010-05-02 01:27:45

+0

请显示您的代码,并列出您定位的平台/操作系统。另外,为什么不使用互斥锁?信号量是不一样快或那样强劲,根据操作系统/执行 – 2010-05-02 01:27:45

+0

山姆,互斥是短期的互斥_semaphore_,一类特殊信号在资源限制为1。而且,即使OP使用其他的信号量,这可能是因为我引用了“我们必须使用信号量”。 :-) – paxdiablo 2010-05-02 01:32:49

回答

6

请记住,单一UNIX规格未必是你的情况的控制文件。诚然,它可能应该是,但是由于您没有真正指定平台,因此您可能处于决定遵循不同规则和/或具有其他返回代码的环境中。

有几件事要检查。

1 /您是肯定sem_wait正在返回-1吗?我已经看到编码人员在接到电话后简单地检查了errno,并没有意识到大多数电话在成功时不会将其设置为零,而是让他们单独放置。这是可能的,如果errno被的sem_wait调用之前设置为EBADF会出现这样的情况。

2 /您已按照创建信号灯的所有规则,如初始化呢?

3 /您是否指的是有效的信号量?主要是,你确定me指数没有超出范围?

短看到了一些代码,这就是所有我必须给的建议。


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

通过这样做,正在使用,而不是正确的全球errno螺纹宏观(这样会给线程特定errno)。

这是否是你的问题,我不知道,但它可能是值得探讨。


并且紧跟着那条消息链,还有一些其他的可能性。

4 /是否使用sem_init初始化的信号量。如果是这样,请检查其返回值。该消息是从2008年,因此它可能被过时的信息,但仍OSX可能不支持sem_init,宁愿sem_open(见here)。你真的应该从所有sem_功能检查返回代码,以及刚需一定的(如果你使用sem_init为他们所有的(如果它是不支持的),并且只检查一个,你会发现,他们全部失败)。

5 /有(是?)在OSX下线程errno功能链,其中调用另一个库调用pthread_self使用errno之前__error功能的race condition(在主线程,或者在current_thread->errno其他线程)。从技术上讲,这是不允许的,并且有一个小问题可能出现。

+0

我包含'errno.h',以便根据该网站不应该成为问题。 – marsolk 2010-05-02 02:14:24

+2

你是对的,不支持'sem_init'。甚至没有一个手册页。 Goddammit,苹果。谢谢,paxdiablo。 – marsolk 2010-05-02 02:32:11