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