「セグメンテーション違反」メッセージはSTDERRの下にありますか?


17

で実行可能ファイルを実行しました bash

./code > log

すべてのprintfステートメントがログファイルに記録されるのに対し、ターミナルには時折エラーメッセージが表示されます。以下のように再実行します

./code >& log

現在、時折発生するエラーメッセージもログに記録されます。ただし、セグメンテーションフォールトがある場合、端末には引き続き表示されます。どうして?メッセージをSegmentation fault (core dumped)ログファイルに記録する方法は?


user $ bash --version

GNU bash、バージョン4.2.24(1)-release(i686-pc-linux-gnu)

回答:


14

セグメンテーションフォールトはシグナルです。これをキャッチしていない場合、プログラムは終了し、シェルはこれを(プログラムのstderrではなく)stderrに出力します。

プログラムまたはシェルは、プログラムがシグナルをキャッチするか、シェルがSIGCHILDシグナルをトラップしてから子供の終了ステータスをチェックすることにより、これが発生したときに特定のアクションを実行することができます。


1
@ user13107help trap
カルロスCampderrós

2
うん。とった。もし誰の興味、ここに私がやったことだpastebin.com/QyeJYYHC
user13107

1
shell trapコマンドは、シェルに送信されたシグナルをトラップします。そのため、プログラムに送信されているものをキャッチすることはできません。
-derobert

1
@ warl0ckは、信号をキャッチするのと同じ方法でセグメンテーションフォールトをキャッチすることができますが、これは未定義の動作につながる可能性がありますが、何をしているのかを知っていれば、少なくとも賢明な方法で死ぬことができます。OPはstderrに印刷したかったため、この場合はセグメンテーション違反を検出して安全に印刷できました。
cjh

1
@ warl0ck:できます。ハンドラーで何かを行うのは非常に悪い考えですが、ログに記録して終了するだけです。ただし、いくつかの特殊なユースケースがあります。
Linuxios

19

「セグメンテーションエラー」メッセージはstderrに出力されますが、これはシェルの標準エラーであり、プログラムの標準エラーではありません。シェルは、プログラムがシグナルのために終了したことを検出すると、このメッセージを出力します。

プログラムを実行するシェルスクリプトの一部にstderrをリダイレクトすることにより、メッセージを黙らせることができます。

{ ./code; } >&log
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.