共有リソースを安全に更新するために、php スクリプトで次のコード フラグメントを使用しています。
$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 で失敗します。man ページは、semop() システム コールがシグナルによって中断されたことを示しています。
私の質問は、このエラーを安全に無視して sem_acquire を再試行できるかどうかです。
編集:私はこの問題を誤解しています。以下に投稿した説明を参照してください。
ラジ