2010-05-02 44 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