2016-10-11 19 views
5

Birden çok işlem ve sinyal ile çalışıyorum ve dün, printf'in yeniden giriş işlevi olmadığını öğrendim, bu yüzden sinyal işleyicileri kullanarak bir risk var. Bununla ilgili yapabileceğim bir şey var mı? Printf veya printf'in yerini alabilecek herhangi bir yeniden giriş syscall'ı var mı?Yazıcıyı yeniden giriş işlevi olarak kullanma C

Teşekkürler!

+1

Şaşırtıcı bir açıklama için bu cevabı kontrol edin: http://stackoverflow.com/questions/3941271/why-are-malloc-and-printf-said-as-non-reentrant – bruceg

+1

Sadece neden etkinleştirmek istediğinizi merak ediyorum iki veya daha fazla süreç olması aynı anda bir şeye yazılır. YAoRuE cYoOmUpTlHeItNeKlIyN Gm? Ad? – Tibrogargan

+0

'Yazma ', async-safe'dir, bu yüzden bir sinyal tutucusundan kullanılabilir ... –

cevap

4

Sinyal işlemcileri genelde çok zor olurlar. Oldukça zor olan, genellikle içlerinde yapılabilecek tek güvenli işlem, "işaret alındı" bayrağı ayarlanması ve daha sonra programın ana döngüsünün (veya çok dişli bir uygulamada özel bir sinyal işleme ipliğinin) gerçek sinyali yapmasını sağlamaktır. taşıma.

+0

Sinyal işleyicimde yalnızca bir bayrağı (statik bir değişken gibi) ayarlarsam, kodum printf'a geri döndüğünde yazdırma mesajın geri kalanı? Eğer evet ise neden oluyor? –

+1

Sinyal taşıyıcı, ne varsa ne olursa olsun keser. Kesilen printf şu anda bir syscall durumundaysa, çekirdek işlemi tipik olarak çalışmayı durdurur (diğer bir deyişle, sistem çağırma işleminden önce durumdaki her şeyi geri yükler) ve errno ile ERESTART konumuna getirilir (Kesilen sistem çağrısı yeniden başlatılmalıdır). Printf gibi kütüphane fonksiyonları sadece bu hatayı döndürecektir (yani -1 ile geri dönüp errno'dan ayrılır). Fonksiyon bir syscall içinde değilse, sinyal işleyicisi geri döndüğünde devam edecektir ve işaretin yerini tespit etmenin tek yolu işaretinizi kontrol etmektir. –

+0

Anladım. Peki, çekirdeğimden gelen bir sinyalle kesintiye uğrarsa, bayrağımı yeniden basmak için bayrağımı nasıl kullanabilirim? –

İlgili konular