Semop çağrı için EINTR hata

2 Cevap php

Ben güvenli bir paylaşılan kaynak güncellemek için bir php komut aşağıdaki kod parçasını kullanıyorum.

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

Ben istekleri çok sayıda bu kodu stres testi ne zaman bir hata alıyorum:

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

php kaynakları başarısız edinme SYSVSEM_SETVAL için aşağıdaki kodu gösterir

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;
    }
}

hangi semop EINTR ile başarısız demektir. man sayfası semop () sistem çağrısı bir sinyal tarafından kesildi ortaya koymaktadır.

Benim soru güvenle bu hatayı görmezden ve sem_acquire yeniden olabilir mi?

Edit: Ben bu sorunu yanlış anlamış, Pl aşağıda attılar açıklama bakın.

hükümdarlık

2 Cevap

(Kodun gösterdiği gibi, EINTR başka bir şey alıyoruz) Ben ENOSPC görmezden olmaz. Eğer daha önce tükenmiş bir kaynak için bekleyen yoğun bir döngü içinde sona erebilir. Eğer bir yerde bazı alanı dışında iseniz, size bu konuyla ilgilenmesi emin olmak istiyorum. ENOSPC genellikle size ... şey dışında demektir.

Rastgele fikirlerin bir çift:

Ben PHP uygulama konusunda uzman değilim, ama ben sem_get() Eğer semafor istediğiniz her zaman arama önlemek için denemek istiyorum. Yerine tanıtıcı depolamak. Bazı kaynak sem_get her çağrı ile ilişkili, ve uzayda bitiyor nerede olduğunu olabilir.

I sem_get() üzerinde hata döner kontrol ettiğinizden emin olun istiyorum. Bu kod parçacığı, ama sema4 almak için başarısız olsaydı sem_op() (belki de EINTR mantıklı) çalışırken, tutarsız sonuçlar elde ediyorum

Bu soruyu yazdıktan sonra ben errno == EINTR gibi bir kod yanlış yorumlamak ve sonuca atladı fark ettim. Bataklık işaret ettiği gibi Yani, hata ENOSPC olup EINTR. Bazı kazma sonra ENOSPC nedenini yer. Geri alma arabellek sayısı bitkin ödendi. I semmnu sayısı arttı ve şimdi kod dışarı sorunları ile çalışıyor. I-semmnu değeri olarak semmni*semms l kullandık