7

このCプログラムで は

#include <stdio.h>
#include <fcntl.h>
int main()
{
    int file = open("Result", O_CREAT|O_WRONLY, S_IRWXU);

    dup2(stdout, file);
    system("ls -l");

    return 0;
}

system()の出力をファイルにリダイレクトしようとしています。そのため、 dup2を使用しましたが、機能していません。

このコードの何が問題になっていますか? そして、これを行うためのより良い方法
があれば教えてください。(端末で使用せずに)>

4

4 に答える 4

6

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

dup2(file, 1);

代わりは。

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

system("ls -l > Result");

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

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

system("/bin/ls -l > Result");
于 2012-06-25T12:38:21.367 に答える
4

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

参照

于 2012-06-25T12:39:45.187 に答える
0

dupの代わりに使用しdup2ます。dup別名ファイル記述子を作成します。この値は、常に利用可能な最小のファイル記述子でなければなりません。

new_fd = dup(file);- このステートメントfileでは、値が含まれている可能性があります3( stdinis 0stdoutis1およびstderrisであるため2)。そうnew_fdなる4

stdoutファイルにリダイレクトする場合。次に、以下のようにします。

close(stdout);
new_fd = dup(file);

これで、dup はディスクリプタのエイリアスとして 1 を返します。これは、開いたファイル ディスクリプタが使用可能な最小のファイル ディスクリプタでfileあるために閉じたためです。stdout0,2,31

dup2手段を使用している場合は、次dup2(file,1);のようにします

于 2012-06-25T13:00:39.730 に答える