EINTR Hatası Nedir? Nasıl Çözülür?

EINTR, farklı engelleme işlevlerinden alabileceğiniz POSIX hatalarından biridir. POSIX standardı yararsız bir şekilde Kesintisiz işlev olarak tanımlamaktadır. EINTR için Google, “EINTR hatası alıyorum. Şimdi ne olacak?” çoğunlukla “Kesilen işlevi yeniden başlat.”Bunların hiçbiri, EINTR’yi doğru bir şekilde ele almak ve ne yaptığınızın nedenini anlamakta pek yardımcı olmaz. Bu blog yazısında eıntr hatası nedir? nasıl çözülür? nasıl başa çıkacağınızı açıklamaya çalışacağız.

Hata Alma Aşaması

EINTR’in ardındaki mantığı anlamak için, biraz kodlama çalışması yapalım. Bir soketten aldığı her byte için bir işlem yapan basit bir olay döngüsü yazalım.

void event_loop (int sock)

{

while (1) {

char buf [1];

recv (sock, buf, 1, 0);

printf (“perform an action\n”);

}

}

Yukarıdaki program harika çalışıyor. Bununla birlikte, programı Ctrl + C kullanarak kesmek derhal onu öldürür, bu da bir temizlik yapmak istiyorsak sorun yaratabilir, örneğin sistem genelinde bazı kaynakları serbest bırakır. Sorun şu ki, recv engelleyici bir işlevdir. Olay döngüsü recv’de engellenirken Ctrl + C tuşlarına basılırsa, bir tür kilitlenme elde edersiniz. Sinyal işleyici beklendiği gibi yürütülür sonra yürütme blokları, ‘stop’ değerini 1 olarak ayarlar.

POSIX Spesifikasyonu

POSIX spesifikasyonu, sinyal (Ctrl + C gibi) yakalandığında, recv’nin EINTR hatası verdiğini tanımlar. Bu, olay döngüsünün çevrilmesini ve ‘stop’ değişkenini kontrol etmesini sağlar. Ctrl + C tuşlarına bastığınızda, temizlik işlemini önceden yapan programdan çıkar. EINTR recv dönüşü gibi engelleme fuctions yapmaya unutmayınız. EINTR geri döndüğünde sadece engelleme işlevini yeniden başlatmak için ortak bir tavsiyenin işe yaramadığıdır. Bu durumda Ctrl + C tuşlarına basıldığında, sinyal işleyicisi yürütülür, ‘stop’ 1 olarak ayarlanır, recv, EINTR değerini döndürür, ancak program sadece recv’yi çağırır ve engeller. Bu nedenle ‘dur’ kontrol edilmez ve program sıkışır.

Hatanın Çözümü

EINTR hatasını kullanırken, sinyal işleyicileri tarafından değiştirilmiş olabilecek koşulları kontrol edin. Sonra engelleme işlevini yeniden başlatın. Ek olarak, kendiniz engelleme işlevini uyguluyorsanız, bir sinyalle karşılaştığınızda EINTR’yi geri döndürmeye dikkat edin. Ctrl + C, ZeroMQ kütüphanesi Python’dan kullanıldığında işe yaramadı. Bazı araştırmalardan sonra, Python çalışma zamanının yukarıdaki örneklere benzer şekilde az ya da çok çalıştığı ortaya çıktı. Ctrl + C sinyali yakalanırsa, işleyicide bir değişken ayarlar ve sinyale bağlı koşulların kontrol edildiği bir noktaya gelene kadar yürütmeye devam eder. Bununla birlikte, ZeroMQ kütüphanesi engelleyici bir recv işlevine sahipti, bu EINTR döndürmedi ve sinyalleri görmezden geldi. Olan, ZeroMQ’nun Python’dan gelen recv işlevini kullanan ve gelen verileri beklemeye başlayan kullanıcı oldu. Ardından kullanıcı Ctrl + C tuşlarına basın. Python’un sinyal işleyicisi, işlemin en kısa sürede sonlandırılması gerektiğinin altını çizerek sinyali ele aldı. Bununla birlikte, yürütme, ZeroMQ’nun Python çalışma zamanına bir daha geri dönmediği ve dolayısıyla sonlandırma işleminin hiçbir zaman gerçekleşmediği recv işlevi içinde engellendi. Sinyal durumunda EINTR ile recv fonksiyonundan çıkmak sorunu çözdü.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.