2010-11-27 4 views
3

私は、PIPESを使って外部アプリケーションと通信するCプログラムを持っています。RUNTIME ERRORSをSTDERRにリダイレクトする方法は?

私はこのためにEXECLを使用

:今、私はパイプ

dup2(fd[1], STDERR_FILENO); 

そして、私は簡単なのPythonを使用していることをテストする場合の書き終わりに、すべてのSTDERRをリダイレクトするDUP2をもを使用している

execl("./errorprogram","./errorprogram", NULL); 

スクリプトのような:

data = sys.stdin.read() 
sys.stderr.write("Bad error\n") 

私は喜んで "親"でそのエラーを読むことができます。私の問題のために今

:REALLOC文が上記にあっ故意である

#include<stdio.h> 
#include<string.h> 

void main(){ 
    char szInput[1024]; 
    char *badvar; 
    gets(szInput); 

    badvar = realloc(badvar, 100); 
    puts(szInput); 
    fflush(NULL); 
} 

:のは、私はそれでメモリリークなどの「無効なポインタ」エラーが発生しましたC「子プログラム」を持っているとしましょう(親が、唯一の子プロセスに影響を与えていないobvioulsy)プログラムが死ぬことを引き起こし、そして私は、実行時に次のようなエラーが発生します:のrealloc():無効

* glibcの ./errorを検出ポインタ:0xb77a5250 * *

全体staceトレースなど....

今、私はSTDERRに、このような任意のランタイムエラーを取得することができますどのように私は戻って、親への完全なトレースを読むことができますか?

「ランタイムエラーをSTDERRにリダイレクトする必要がありますか?確かに、親がそれらを記録することができるように、子供から提起されたこれらの忙しいエラーをキャッチすることは可能ですか?

任意のヘルプやアドバイスが大幅リントン

;-)

おかげ

をいただければ幸いです

答えて

0

一つの可能​​な解決策あなたがLinuxなど信号を、サポートしているシステム上で作業している場合、ありますシグナル伝達機構を使用する。 シグナルアクションを無効なメモリ参照(これはSIGSEGVシグナルだと思います)をインストールすると、上記の特定の例が見つかるはずです。ハンドラでは、エラーメッセージをSTDERRに印刷できます。ただし、スタックトレースを判断するには何らかの方法が必要です。

+0

こんにちは、信号についてのコメントのおかげで、私はそれを試してみる....私は単純に "リダイレクト"する方法があったと思っていたが、信号が唯一の方法なら、私は試してみる...ありがとう;-) –

+0

あなたが望むように動作するソリューションを見つけたら、ここに投稿してください。私は知りたいと思うだろう。 – River

+0

そうだけど、正直言って信号は今のところ唯一のアプローチだと思うが...もっと掘り下げる;-) –

5

デフォルトでは、プロセスの制御端末が存在する場合、Glibcは出力を生成します。あなたは環境変数LIBC_FATAL_STDERR_=1を設定したいと思うのですが、代わりに致命的なエラーをstderrに送るでしょう。

+0

おかげで、それは便利ですが、私はちょうど私のDebianマシン上でそのENV変数を設定して、再度コードを実行し、それはまだので、(私はパイプの書き込み端にSTDERRをリダイレクトしているにもかかわらず、それを画面に出し親はエラーメッセージを読み取ることができます)。なぜこれが機能しないのか? –

+1

変数を正しく設定してエクスポートしてもよろしいですか? glibcのは、[年間、このスイッチに従った(http://sourceware.org/git/?p=glibc.git;a=commit;h=1327439fc6ef182c3ab8c69a55d3bee15b3c62a7)、のsetuid/setgidプログラムを除きます。 – ephemient

+0

今日はこれを今日使用し、宣伝されたとおりに動作することを確認しました! –

関連する問題