0

File1.txt ">" File2.txtcatコマンドをオーバーライドするために、ターミナル引数としてプログラムに渡そうとしています。しかし、何らかの理由で、プログラムは機能していません。上記で定義されたケースではargcは4ですが、それでもプログラムの条件は真になりません。コードは次のとおりです。

int main(int argc, char *argv[])
{
int readbytes,fp;
char buf[1024];

if(argc==2)
{
    fp=open(argv[1],O_RDONLY);
    dup2(0,fp);
    close(fp);
    readbytes=read(STDIN_FILENO,buf,1024);
    write(STDOUT_FILENO,buf,readbytes);
}

if(argc==4)
{
    printf("inside4");
    fp=open(argv[1],O_RDONLY);

    dup2(fp,0);

    close(fp);

    fp=open(argv[3],O_WRONLY|O_CREAT|O_TRUNC,S_IRWXU);

    dup2(fp,1);

    close(fp);

    readbytes=read(STDIN_FILENO,buf,1024);

    //printf("%c",buf);

    write(STDOUT_FILENO,buf,readbytes);
}
return 0;
}

この問題の解決策が見つからなかったので、今は専門家に任せています。この問題の理由は何ですか?

ノート:

何らかの理由で./progFile1.txt>File2.txtをプログラムに送信すると、argc==2条件が選択されますが、argcは4です。これはなぜですか。

よろしく

4

2 に答える 2

5

これは、プログラムの実行方法が原因である可能性があります。タイピング

./myProg foo > bar

ほとんどのシェルにmyProg引数を指定して実行し、出力されたものをすべて.という名前のファイルfooに保存するように指示します。、、をコマンドライン引数として渡すには、次を使用します。stdoutbarfoo>bar

./myProg foo \> bar

また

./myProg 'foo' '>' 'bar'

補足:を使用してファイルに出力をパイプすること>はシェルの一部であり、それ自体のようなプログラムではないため、catおそらくそれについて心配する必要はありません。書き込むだけstdoutで、残りはシェルが処理します。

于 2012-12-10T16:19:24.500 に答える
1

どういう意味the condition in the program is not getting trueですか?端末に「inside4」が印刷されていないということですか?考慮すべきことがいくつかあります。まず、エラーチェックを行いません。すべての通話が成功したopenと想定する必要があります。dup2「inside4」が出力ファイルの最後に出力されると思います。その理由は、printf実際には何も書かないからです。文字列「inside4」をバッファに格納するだけですが、そのバッファはプログラムが終了するまで出力に書き込まれず、その時点で基になるファイル記述子が出力ファイルに変更されています。最も簡単な修正は、出力に改行を追加して、次のように記述することです。printf( "inside4\n" ); 通常の設定では、改行を印刷すると内部バッファーがフラッシュされます。printfを呼び出して、呼び出し後にバッファを明示的にフラッシュすることもできますfflush

于 2012-12-10T22:22:29.473 に答える