C:どのように標準出力またはファイルにシステム・コマンドからの標準エラー出力をリダイレクトするには?

StackOverflow https://stackoverflow.com/questions/3019630

質問

stderrにシェルコマンド$ avrdude -c usbtiny出力テキスト。私は、このようなヘッドレス以上になっていないcosを標準出力としてcommmandsでそれを読み取ることができません。私は、標準出力またはファイルにテキストをしたいです。どのように私はCでそれを行うことができますか?私は私の最後の質問のが、まだ未解決で問題を解決しようとしてきました。

役に立ちましたか?

解決

私はOpenBSDの中でこのような何かを試していませんでしたが、少なくともいくつかの* nix系のシステムでは、あなたがこの使用dup2を行うことができます。

#include <unistd.h>
#include <stdio.h>

int main(void) {  

  fprintf(stderr, "This goes to stderr\n");

  dup2(1, 2);  //redirects stderr to stdout below this line.

  fprintf(stderr, "This goes to stdout\n");
}

他のヒント

通常の方法は次のようなものになるだろう

avrdude -c usbtiny 2>&1

これは、通常、代わりにstdoutに行くにstderrに行くだろう何を指示します。あなたは、ファイルにそれを指示することを好むだろう場合は、あなたのような何かを行うことができます:

avrdude -c usbtiny 2> outputfile.txt
以下は、標準エラー出力ファイル番号に標準出力ファイル番号を複製するPOSIX関数を使用しています。 stdoutに標準エラー出力は次のように dup2 のPOSIXページに記載されている複製します関数の使用例

#include <unistd.h>
#include <stdio.h>

int main (void)
{
    pid_t child = fork();

    if (child == 0)
    {
        dup2(STDOUT_FILENO, STDERR_FILENO);
        execlp("avrdude", "-c", "usbtiny", NULL);
    }
    else if (child > 0)
    {
        waitpid(child);
        puts("Done!");
    }
    else
    {
        puts("Error in forking :(");
    }

    return 0;
}
  私はその標準エラー出力

を得ることができるので、

私は何とかCでコマンドをブロックする必要があります

man fork、子プロセスを起動する方法についてman execを読み取ることにより、

スタート。子供を享受する方法についてman 7 signalman sigactionman waitに見ます。

最後に、man dup2ます。

例示する未テストコード:

int pip_stderr[2];
int r;
int pid;

r = pipe(pip_stderr);
assert( r != -1 );

int pid = fork();
assert( pid != -1 );
if (pid == 0) { /* child */
   /* child doesn't need to read from stderr */
   r = close(pip_stderr[0]); assert( r != -1 );
   /* make fd 2 to be the writing end of the pipe */
   r = dup2(pip_stderr[1], 2); assert( r != -1 );
   /* close the now redundant writing end of the pipe */
   r = close(pip_stderr[1]); assert( r != -1 );
   /* fire! */
   exec( /* whatever */ );
   assert( !"exec failed!" );
} else { /* parent */
   /* must: close writing end of the pipe */
   r = close( pip_stderr[1] ); assert( r != -1 );

   /* here read from the pip_stderr[0] */

   r = waitpid(pid,0,0); assert( r == pid );
}

dup2の()を使用して、我々は、パイプの書き終わりと子の(2 fdがされて)標準エラー出力を交換してください。パイプは、())(フォーク前に呼び出されます。フォークの後、我々はまた、親プロセスでの読み取りが実際にEOFを受け取ることになるように、パイプのの両端をぶら下げすべてのを閉じる必要があります。

おそらく標準入出力を使用して簡単な解決策はありますが、私はそれに気づいていませんよ。 popenの()はシェル経由でコマンドを実行しているので、おそらく1は標準出力に標準エラー出力をリダイレクトするためにそれを伝えることができます(およびstdoutには/ dev / nullに送信します)。ことを試したことはありません。

は一つも戻って一時ファイルを読み取る)(システムの一時ファイルへの以降のコマンドの標準エラー出力をリダイレクトする一時ファイル名、システムのCOMPOSEコマンドを()を作成する)((man 3 mktemp)をmktempを使用することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top