簡體   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