2010-07-14 18 views
7

Neler oluyor burada? SIGINT'in ön plan süreç grubuna gönderileceğini düşündüm. SIGINT neden burada yakalanmıyor?

(Sanırım, belki, o sistem() alt süreç için yeni bir süreç grubu oluşturuyor bir kabuk? Herkes? Bu teyit edebilir çalıştıran)
% perl 
local $SIG{INT} = sub { print "caught signal\n"; }; 
system('sleep', '10'); 

Sonra ctrl sonra + d ctrl isabet + c hemen ve "yakalanan sinyalin" hiçbir zaman basılmadığını fark edin. Böyle hissediyorum

zaten bu geçici bir çözüm için ... basit bir şeydir? Sorun tüm yineleme tamamlanana kadar ctrl + c tutan sistem sonuçları yoluyla komutların bir demet çalıştırırken ... (perl SIGINT çünkü geçmez) ve oldukça rahatsız edici

Bu nasıl çalışılan bu? (Zaten doğrudan) (çatal kullanılarak test ve ... Bu şu anda kabul edilebilir bir çözüm değildir çalıştığını anlamak)

GÜNCELLEME: Bu "uyku" ile ilgisi ilgisi sahiptir lütfen unutmayın, sadece komutun, etrafındaki perlinkinden önemli ölçüde daha fazla olan, koşmak için uzun süreler uzun süren bir zaman alması gerçeği. Öyle ki, ctrl + c tuşlarına basılması (ön plan işlem grubunda olduğu gibi) komuta gönderilir ve bir şekilde asla perl'e gönderilmez.

cevap

4

: SIGINT ve SIGOUT programınızın bu sinyalleri alındığında sonlandırmak için beklemek durumunda sistemin, yürütülürken dikkate alınmaz

beri bunu kendiniz dayalı yapmak düzenlemek gerekir geri dönüş değeri.

@args = ("command", "arg1", "arg2"); 
system(@args) == 0 
    or die "system @args failed: $?" 

elle sistemin başarısızlığını incelemek isterseniz, size $ inceleyerek tüm olası hata modlarını kontrol edebilirim? Böyle: Alternatif

if ($? == -1) { 
    print "failed to execute: $!\n"; 
} 
elsif ($? & 127) { 
    printf "child died with signal %d, %s coredump\n", 
     ($? & 127), ($? & 128) ? 'with' : 'without'; 
} 
else { 
    printf "child exited with value %d\n", $? >> 8; 
} 

POSIX modülü

+3

metheler Dokümanları tekrar tekrar okuman gerek: -/Teşekkürler. – dlamotte

+1

Çocuğun geri dönüş değerini incelemeniz gerekmesinin sebebi, kabuğunuzun, tüm süreç grubuna (c) ve/veya çocuklara (cc) ve çocuklara, bu durumda çocuğunuzu 'uykuyu (10') sona erdirmesidir. Eğer başka bir kabuktan -INT $ perl_pid'i öldürürseniz, perl SIG_IGNore sizi mutlu edecektir. – pilcrow

0

Oldukça burada başarmak istediğiniz şeyi alamadım ... ama sadece karşılaştırarak çalıştı adres:, sizin için gitmeye çalışıyoruz ne etkisi açıklayabilir

perl -wle'local $SIG{INT} = sub { print "caught signal"; }; sleep 10;' 

ve Neden kabuğu çağırıyorsun? Kabuğun içine girmeden doğrudan harici programa çağrı yapabilir misiniz? perldoc system den

+0

benim GÜNCELLEME bölümüne bakın çağrıları) W * (ile $ değerini {^ CHILD_ERROR_NATIVE} inceleyebilirler, "uyku" ilgisi yok onunla yapmak ... sadece bazı keyfi süreç için bir yer tutucu. Ben uyku bir yer tutucudur fark: Bu kolaylıkla – dlamotte

+0

@xyld stdin'i veri okumak için bekliyor çünkü sonsuza askıda kalacaktır "grep şey" ile geçiş olabilir. Sadece sürecinizi doğrudan çağırmaktan ziyade kabuğu çağırmaya neden ihtiyaç duyduğunuzu soruyordum. – Ether

+0

Açıkça değilim, ama perl yorumcusu bunu "system()" nin bir parçası olarak yapıyor olabilir. – dlamotte