2011-06-21 13 views
5

Pitonda bir sinyalin işlenmesi iş akışı nedir? Sinyal işleyicisi kurdum, sinyal oluştuğunda, python işlevimi nasıl çağırıyor? İşletim sistemi tıpkı C programı gibi mi çağırıyor? Eğer bir C python uzatıyorsam, hemen kesiliyor mu?Piton bir sinyali nasıl işler?


Şimdi bana göre, python işlemi bir sinyali nasıl ele alıyor? Sinyal modülü tarafından bir sinyal belirlediğinizde, modül işleyicinizi ayarlayan ve bunu 1 (Handlers[sig_num].tripped = 1;) olarak işaretleyen bir işlev signal_handler ($ src/Modules/signalmodule.c dosyasına bakınız) kaydedecektir, daha sonra python yorumlayıcısına söylemek için Py_AddPendingCall'ı çağırın. Python yorumlayıcısı, işlevinizi ana döngüde çağıran PyErr_CheckSignals'ı çağırmak için Py_MakePendingCalls'ı çağırır (bkz. $ Src/Python/ceval.c). Bu konuda konuşmak isterseniz, bana bildirin: [email protected]

cevap

6

bayt kod tercüman yeniden girer. İşleyici hemen çalıştırılmıyor. Sinyal oluştuğunda bir sıraya yerleştirilir. Kod yolu şu anda C kodunda, yerleşik veya uzantı modülündeyse, C kodu Python bayt kod yorumlayıcısına kontrol döndürene kadar işleyici ertelenir. Bu uzun bir zaman olabilir ve gerçekten ne kadar uzun süre olduğunu tahmin edemezsin.

En önemlisi sen taleb ile etkileşimli modunu kullanıyorsanız bunu yorumlamak için bazı giriş vermek kadar sinyal işleyici yayınlanmaz sağladı. Bunun nedeni, giriş kodunun readline kütüphanesinde (C kodu) bulunması ve tam bir satıra sahip olana kadar tercümana dönmemesidir.

+0

Bu yüzden python yorumlayıcısı sinyali işliyor ve işlevimi çağırıyor. Bunun nasıl olacağını bilmek istiyorum. Ignalmodule.c dosyasını okudum, python funkleri bir diziye eklenir ve PyErr_CheckSignals, işlenenleri çağırır. Ancak, PyErr_CheckSginals işletim sistemi tarafından sinyal gönderildiğinde nerede çağrılır? – renenglish

+0

İşletim sistemi tarafından sinyal gönderildiğinde çağrılmaz. Baskı işleyicileri, yazdırırken, kullanıcı girişini okuyorken, vb. Çalıştırılabildiğinde, yorumlayıcıda çeşitli yerlerde açıkça çağrılır. Bu, kesme işleyici sırasını çalıştırır. – Keith

+0

Thx çok fazla! Şimdi bana göre python süreci bir sinyali nasıl ele alıyor? Sinyal modülü tarafından bir sinyal belirlediğinizde, modül işleyicinizi ayarlayan ve bunu 1 olarak işaretleyen bir signal_handler işlevine (bkz. $ Src/Modules/signalmodule.c) kayıt olur (Handlers [sig_num] .tripped = 1;), daha sonra python yorumlayıcısına söylemek için Py_AddPendingCall'ı çağırın. Python yorumlayıcısı, işlevinizi posta döngüsünde çağıran PyErr_CheckSignals'ı çağırmak için Py_MakePendingCalls'ı çağırır ($ src/Python/ceval.c'ye bakın). – renenglish

0

signal module'a bir göz atın. Eğer bir python senaryosuna bir sinyal gönderirseniz, benim için bir işleyici olup olmadığını anlamak için bu sinyalleri işleyecek ve potansiyel olarak belirli sinyalleri ele alma ve göz ardı etme yeteneğine sahip olacaksınız. yani. Bir SIGKILL'i öldürmek yerine, öldürmeden önce bir miktar kapatma temizleme çalışması yapmaya çalışırsınız. Bunu yaparken tercüman yalnızca onu çalışacaktır sinyal modülü kullanarak bir Python kodu sinyal işleyici ayarlarsanız