2008-11-07 20 views
1

我在php腳本中使用以下代碼片段來安全地更新共享資源。semop調用EINTR錯誤

$lock_id = sem_get(ftok('tmp/this.lock', 'r')); 
sem_acquire($lock_id) 
//do something 
sem_release($lock_id) 

當我壓力測試這個代碼用大量的請求,我得到一個錯誤:

Warning: semop() failed acquiring SYSVSEM_SETVAL for key 0x1e: No space left on device in blahblah.php on line 1293 

PHP來源顯示下面的代碼未能獲取SYSVSEM_SETVAL

while (semop(semid, sop, 3) == -1) { 
    if (errno != EINTR) { 
     php3_error(E_WARNING, "semop() failed acquiring SYSVSEM_SETVAL for key 0x%x: %s", key, strerror(errno)); 
     break; 
    } 
} 

這意味着執行semop EINTR失敗。手冊頁顯示semop()系統調用被信號中斷。

我的問題是我可以放心地忽略這個錯誤並重試sem_acquire?

編輯:我誤解了這個問題,請參閱我在下面發佈的說明。

拉吉

回答

1

我不會忽略ENOSPC(你得到比其他EINTR的東西,如代碼所示)。您可能會在繁忙的循環中等待您早先耗盡的資源。如果你在某個地方沒有空間,你想確保你處理這個問題。 ENOSPC通常意味着你沒有......某種東西。

一對夫婦的隨機思路:

我不是在PHP實現的專家,但我會盡量避免你想要的信號,每次打電話sem_get()。改爲存放手柄。可能某些資源與每次對sem_get的調用相關聯,這就是空間不足的地方。

我一定要檢查您的錯誤返回sem_get()。這是一個代碼片段,但如果你是拿不到sema4,你會試圖sem_op()它時,得到不一致的結果(也許EINTR有道理)

0

張貼這個問題,我發現後,我看錯代碼爲errno==EINTR並得出結論。正如沼氣指出的那樣,錯誤是ENOSPC而不是EINTR。經過一番挖掘,我找到了原因爲ENOSPC。撤消緩衝區的數量已經耗盡。我增加了semmnu的數量,現在代碼運行時沒有問題。我已使用semmni*semms l作爲值semmnu