Soru Tarihi:
Perl, sistem scriptleri için bir dil olarak geliştirildiğinden, sinyal yönetimi (SIGTERM, SIGINT, SIGHUP) her zaman yerleşik ve güçlü bir imkan olmuştur. Bu sistem, dış olayları (kullanıcı durdurması, demon yenilemesi, zaman aşımı) yakalayarak scriptlerin düzgün bir şekilde sonlandırılmasını veya davranışlarının değiştirilmesini sağlar.
Problem:
Yanlış sinyal işleme, scriptlerin hatalı bir şekilde sonlandırılması veya takılması, acil kapanma sırasında veri kaybı ve süreçleri durum veya kaynak kaybı olmadan yeniden başlatmanın imkansız olması için sık bir sebep olmaktadır.
Çözüm:
Sinyaller, %SIG adlı özel bir hash içinde işleyici ayarlanarak işlenir. Sinyal işleyicisi içinde yapılacak işlemlerin minimal olması iyi bir uygulama olarak kabul edilir (örneğin, bir bayrak ayarlamak ve ana akışta güvenli bir kapama yapmak). Çoklu iş parçacıklarında ve sinyal işleme durumlarında doğru çalışmak için özel modüller (örneğin, POSIX::sigaction) kullanılır.
Örnek:
my $term = 0; $SIG{TERM} = sub { $term = 1; }; while (1) { last if $term; # ana çalışma } print "Nazik kapama ";
Anahtar özellikler:
Sinyal işleyicisinde print/IO kullanmak mümkün mü?
Cevap: Tavsiye edilmez — hatalı çalışmaya ve veri kaybına yol açabilir! Modern standart — minimum kod (sadece bayrak ayarlama/değişken temizleme).
İlk tetiklenmeden sonra sinyal işleyicisi sıfırlanmadığında ne olur?
Cevap: Sinyal tekrar geldikçe işleyici birden fazla kez çalışır. İlk olaya yalnızca tepki gerekiyorsa, işleyici kendi başına $SIG{...} sıfırlamalı veya kendisine sinyal gönderilmelidir.
Perl'de sinyal işleme thread-safe midir?
Cevap: Hayır! Çoklu iş parçacıklı Perl'de sinyal işleyicileri yalnızca ana iş parçacığında (ana yorumlayıcıda) çağrılır; içindeki iş parçacıklarında sinyaller tamamen atlanabilir veya hatalı işlenebilir.
Demon süreci, SIGTERM aldığında hemen tüm dosya tanımlayıcılarını kapatır ve geçici dosyaları işleyicide siler — zaman zaman dosyalar silinmez, veriler kaybolur.
Artılar:
Eksiler:
SIGTERM sinyaline işleyici sadece $exit değişkenini ayarlamakta, ardından ana döngü dikkatlice kapanış yaparak dosyaları kapatmakta ve ancak sonra kaynakları serbest bırakmaktadır.
Artılar:
Eksiler: