GNU/Linux >> Linux の 問題 >  >> Linux

system() の出力をファイルにリダイレクトする方法は?

stdout FILE * です 標準出力ストリームのポインタ。 dup2 ファイル記述子が必要です。また、パラメータの順序を台無しにしました。使用

dup2(file, 1);

この部分を行うためのより良い方法について。おそらくこの system の後に標準出力を復元したいので、この方法は悪いです コールが完了します。これはさまざまな方法で行うことができます。 dupできます どこかで dup2 それを元に戻します (そして dup を閉じます) ペッドワン)。個人的に cat を自分で書くのは好きではありません 他の回答で提案されている実装。 system を使用して単一のシェル コマンドをリダイレクトすることだけが必要な場合 ファイルシステム内のファイルに、おそらく最も直接的で簡単な方法は、これを行うシェルコマンドを作成することです

system("ls -l > Result");

ただし、ユーザーが 'Result; rm -rf /*' のようなものを指定できるため、ファイル名 (結果) がユーザー入力からのものである場合は注意が必要です。

また、セキュリティのトピックについては、ls へのフル パスを指定することを検討する必要があります。 コメントで提案されているとおり:

system("/bin/ls -l > Result");

簡単なのは > を使うことです 確かに:

#include <stdio.h>
int main()
{
    system("ls -l > /some/file");

    return 0;
}

別の方法は popen() を使用することです 、

の行に沿ったもの
   #include <stdio.h>
   #include <stdlib.h>
   main()
   {
           char *cmd = "ls -l";
           char buf[BUFSIZ];
           FILE *ptr, *file;

           file = fopen("/some/file", "w");
           if (!file) abort();
           if ((ptr = popen(cmd, "r")) != NULL) {
                   while (fgets(buf, BUFSIZ, ptr) != NULL)
                           fprintf(file, "%s", buf);
                   pclose(ptr);
           }
           fclose(file);
           return 0;
   }

popen() を使用する必要があります ライブラリ関数を呼び出し、返された FILE * からデータのチャンクを読み取ります 好きな出力ファイルに書き込んでください。

参照。


Linux
  1. Linuxで出力をファイルとStdoutにリダイレクトする方法

  2. プログラムの出力をZipファイルにリダイレクトする方法は??

  3. リダイレクトとパイプ出力?

  1. Linux – LinuxでProcファイルシステムはどのくらいの頻度で更新されますか?

  2. 出力をファイルと標準出力にリダイレクトする方法

  3. >、&>、>&、および 2&> を使用して出力をリダイレクトすることの違いは何ですか?

  1. 出力をファイルに追加する方法は?

  2. curl -v の出力をパイプまたはリダイレクトするにはどうすればよいですか?

  3. トップコマンドの出力をLinuxのファイルにキャプチャする方法は?