2012-05-02 30 views
0

我正在努力解決readers-writers problem。以下函數應該創建命名信號量。Sem_open導致非法尋道錯誤

void createSems(void){ 

if((sem_counter = sem_open("counter", O_CREAT, 0660, 1)) == SEM_FAILED) 
    printErrorAndKill("sem_open_counter"); 
if((sem_reader = sem_open("reader", O_CREAT, 0660, 1)) == SEM_FAILED) 
    printErrorAndKill("sem_open_reader");  
if((sem_writer = sem_open("writer", O_CREAT, 0660, 1)) == SEM_FAILED) 
    printErrorAndKill("sem_open_writer"); 
if((sem_writer = sem_open("mutex1", O_CREAT, 0660, 1)) == SEM_FAILED) 
    printErrorAndKill("mutex1"); 
if((sem_writer = sem_open("mutex2", O_CREAT, 0660, 1)) == SEM_FAILED) 
    printErrorAndKill("mutex2"); 
if((sem_writer = sem_open("mutex3", O_CREAT, 0660, 1)) == SEM_FAILED) 
    printErrorAndKill("mutex3"); 

} 

void printErrorAndKill (const char *functionName){  
perror(functionName); 
printf("%s: %s\n",functionName, strerror(errno)); 
exit(1); 
} 

在我的MBP 10.7.3上,一切都按預期工作。但是當我在學校服務器上測試它時,我會得到以下輸出。

sem_open_reader: Permission denied 
sem_open_reader: Illegal seek 

每次都成功創建第一個信號量。我試圖谷歌錯誤,但沒有成功或任何連接到sem_open。

我的問題是我做錯了什麼時候創建信號燈或問題是在別的地方?

UPDATE

我做更多的測試,我終於發現它沒有任何非法尋求。我擺脫了行「perror(functionName);」只是爲了發現問題只是使用權限。我們學校的操作系統上保留了一些名字,所以我只需要帶上更多相關的名字。

+0

你怎麼有2個「sem_open_reader」錯誤,但「sem_open_reader」只出現一次?這是什麼操作系統? – cnicutar

+0

檢查printErrorAndKill函數,它打印哪個函數失敗,爲什麼然後它打印一個原因。這樣做是錯誤的嗎? – rojcyk

+0

啊,我沒有看到你打印兩次。你在使用什麼操作系統? – cnicutar

回答

0

「非法查找」消息可能是由perror()引起的。在我的系統上perror的man頁面上說:「請注意,errno在成功調用庫之後是未定義的:這個調用可能會改變這個變量,即使它成功了,例如因爲它在內部使用了一些失敗的其他庫函數。