`Segmentasyon hatası 'mesajı STDERR altına mı geliyor?


17

Çalıştırılabilir bir dosya çalıştırdım bash

./code > log

Terminalde zaman zaman hata mesajları gösterirken, tüm printf ifadeleri günlük dosyasına gider. Aşağıdaki gibi yeniden çalıştırıyorum

./code >& log

Şimdi, zaman zaman hata mesajları da günlüğe gider. Ancak bir segmentasyon hatası varsa, hala terminalde gösterilir. Neden? İleti Segmentation fault (core dumped)günlük dosyasına nasıl girilir?


kullanıcı $ bash --version

GNU bash, sürüm 4.2.24 (1) -çalışma (i686-pc-linux-gnu)

Yanıtlar:


14

Segmentasyon hatası bir sinyaldir, eğer bunu yakalamıyorsanız, programınız sonlandırılacak ve kabuğunuz bunu stderr'a (programınızın stderr yerine) yazdıracaktır.

Programın veya kabuğunuzun bu gerçekleştiğinde, sinyali yakalayan program veya kabuğunuz SIGCHILD sinyalini yakalayıp çocuğunuzun çıkış durumunu kontrol ederek belirli eylemler gerçekleştirebilir.


1
@ user13107help trap
Carlos Campderrós

2
Evet. anladım. kimse ilgileniyorsa, işte ne yaptım pastebin.com/QyeJYYHC
user13107

1
Kabuk trapkomutu trans sinyalleri gönderilir kabuk . Bu yüzden programınıza gönderileni yakalamak işe yaramaz.
derobert

1
@ warl0ck Herhangi bir sinyali yakaladığınız şekilde bir segfault yakalamak mümkündür, ancak bu tanımsız davranışlara yol açabilir, ancak ne yaptığınızı biliyorsanız, en azından mantıklı bir şekilde ölebilirsiniz. OP stderr'e yazdırmak istedi, bu durumda segfault'u yakalamak ve baskı güvenlidir.
cjh

1
@ warl0ck: yapabilirsiniz, işleyicide herhangi bir şey yapmak, ancak giriş ve çıkış yapmak çok kötü bir fikir. Yine de bazı özel kullanım durumları vardır.
Linuxios

19

“Segmentasyon hatası” mesajı stderr'a yazdırılır, ancak programın standart hatası değil, kabuğun standart hatasıdır. Kabuk, bir sinyal nedeniyle programın sonlandığını algıladığında bu iletiyi yazdırır.

Stderr'ı programı çalıştıran kabuk betiğinin bir kısmına yeniden yönlendirerek iletiyi susturun:

{ ./code; } >&log
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.