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);」只是爲了發現問題只是使用權限。我們學校的操作系統上保留了一些名字,所以我只需要帶上更多相關的名字。
你怎麼有2個「sem_open_reader」錯誤,但「sem_open_reader」只出現一次?這是什麼操作系統? – cnicutar
檢查printErrorAndKill函數,它打印哪個函數失敗,爲什麼然後它打印一個原因。這樣做是錯誤的嗎? – rojcyk
啊,我沒有看到你打印兩次。你在使用什麼操作系統? – cnicutar