2

フロントエンド X プログラムがあります。このプログラムでは、バックグラウンド プログラム a.out が呼び出されます。a.out にはいくつかのprintf文章があります。標準出力が に保存されていることがわかりました~/.xsession-errors。それは正常ですか?これらの printf コンテンツを保存したくありません。削除する以外に保存を避ける方法はありますprintfか?

4

3 に答える 3

2

はい、freopen(3)関数を使用stdoutして他のファイルにリダイレクトするか、出力が不要な場合は null デバイスにリダイレクトできます。

// Discard all further output to standard output for the duration of the
// program (or until the next call to freopen()):
stdout = freopen("/dev/null", "w", stdout);

子プログラムの起動方法によっては、stdout ストリームをリダイレクトすることもできます。で起動している場合はsystem(3)、シェルのリダイレクトを使用できます。

system("./a.out args >/dev/null");

fork()andペアで起動する場合はexec()、 stdout ファイル記述子を and の間にリダイレクトしfork()exec()、親プロセスで何も変更されないようにすることができます。

// Error checking omitted for expository purposes
pid_t pid = fork();
if(pid == 0)
{
    // Child process
    int fd = open("/dev/null", O_WRONLY);
    dup2(fd, STDOUT_FILENO);
    close(fd);
    execve("./a.out", argv, envp);
}
于 2013-05-23T02:33:28.817 に答える
1

いくつかの可能性がありますが、完全なリストではありません。

  1. 子プログラムを実行するときは、標準出力/エラーが bitbucket に送信されるような方法で実行しますsystem ("myprog >/dev/nul 2>&1");

  2. その子プログラムに、基本的に何もしない独自の printfvarargs-type 関数を含めます。C ランタイム ライブラリにリンクしようとする前に関数が含まれていれば、ダミーのライブラリが優先的に使用されます。

  3. freopen標準出力とエラーを同じ bitbucket にリダイレクトするために使用します。

オプション 2 と 3 では、子プログラムを変更する必要がありますが、これは望ましい場合と望ましくない場合があります。最初のオプションは、親プログラムを変更するだけで有効になります。

于 2013-05-23T02:33:12.697 に答える