Apakah pesan `Segmentasi fault` berada di bawah STDERR?

17

Saya menjalankan executable di bash

./code > log

Ini menunjukkan pesan kesalahan sesekali di terminal sedangkan semua pernyataan printf masuk ke file log. Saya jalankan kembali seperti di bawah ini

./code >& log

Sekarang, pesan kesalahan sesekali juga masuk ke log. Tetapi jika ada kesalahan segmentasi, itu masih ditampilkan di terminal. Mengapa? Bagaimana cara membuat pesan Segmentation fault (core dumped)masuk ke file log?


user $ bash --version

GNU bash, versi 4.2.24 (1) -release (i686-pc-linux-gnu)

pengguna13107
sumber

Jawaban:

14

Kesalahan segmentasi adalah sinyal, jika Anda tidak menangkap ini maka program Anda akan dihentikan dan shell Anda akan mencetak ini ke stderr (bukan stderr program Anda).

Dimungkinkan untuk program Anda atau shell untuk mengambil tindakan spesifik ketika ini terjadi, baik oleh program menangkap sinyal atau shell Anda menangkap sinyal SIGCHILD dan kemudian memeriksa status keluar anak Anda.

cjh
sumber
1
@ user13107help trap
Carlos Campderrós
2
ya. mengerti. jika ada yang tertarik, inilah yang saya lakukan pastebin.com/QyeJYYHC
user13107
1
trapPerintah shell menjebak sinyal yang dikirim ke shell . Jadi tidak akan berhasil menangkap yang dikirim ke program Anda.
derobert
1
@ warl0ck adalah mungkin untuk menangkap segfault dengan cara yang sama Anda menangkap sinyal apa pun, namun ini dapat menyebabkan perilaku tidak terdefinisi, tetapi jika Anda tahu apa yang Anda lakukan, Anda mungkin setidaknya bisa mati dengan cara yang masuk akal. OP ingin mencetak ke stderr, dalam hal ini menangkap segfault dan pencetakan aman.
cjh
1
@ warl0ck: Anda bisa, itu hanya ide yang sangat buruk untuk melakukan apa pun di pawang tetapi masuk dan keluar. Ada beberapa kasus penggunaan khusus.
Linuxios
19

Pesan "segmentasi kesalahan" dicetak ke stderr, tapi itu adalah kesalahan standar shell, bukan kesalahan standar program. Shell mencetak pesan ini ketika mendeteksi bahwa program telah diakhiri karena sinyal.

Anda dapat membungkam pesan dengan mengarahkan stderr di sekitar bagian skrip shell yang menjalankan program:

{ ./code; } >&log
Gilles 'SANGAT berhenti menjadi jahat'
sumber