-1

catUbuntuでコマンドをオーバーライドするためにこのコードを作成しました。次の3つの命令形式はcat正常に機能していますが、残りは機能していません。

動作するもの:

  • ./catf> File.txt
  • ./catf <File.txt

動作しない:

  • ./catf File1.txt> File.txt
  • ./catf File.txt

上記のように、ターミナル引数をプログラムに送信しています。もう1つの問題は、すべてのファイルに含まれてはならないファイルも含まれEnter your String:ていることです。コードは次のとおりです。

int main(int argc, char *argv[])
{
    int readbytes,fp;
    char buf[1024];
    if(argc==1)
    {
        printf("Enter your String :\n\n");
        readbytes=read(STDIN_FILENO,buf,1024);
        write(STDOUT_FILENO,buf,readbytes);
    }
    else 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);
    }
    else if(argc==3)
    {
        if(argv[1][0]=='<')
        {
            fp=open(argv[2],O_WRONLY|O_CREAT,S_IRWXU);
            dup2(1,fp);
            close(fp);
            readbytes=read(STDIN_FILENO,buf,1024);
            write(STDOUT_FILENO,buf,readbytes);
        }
        else if(argv[1][0]=='>')
        {
            fp=open(argv[2],O_RDONLY);
            dup2(1,fp);
            close(fp);
            readbytes=read(STDIN_FILENO,buf,1024);
            write(STDOUT_FILENO,buf,readbytes);
        }
    }
    else if(argc==4)
    {
        printf("inside");
        fp=open(argv[1],O_RDONLY);
        dup2(0,fp);
        close(fp);
        fp=open(argv[3],O_WRONLY|O_CREAT,S_IRWXU);
        dup2(1,fp);
        close(fp);
        readbytes=read(STDIN_FILENO,buf,1024);
        printf("%c",buf);
        write(STDOUT_FILENO,buf,readbytes);
    }
    return 0;
}

アップデート:

私はコードでWilliamによって提案された変更を行い、コードの残りの部分は正常に機能していますが、これ./catf File.txt ">" File2.txtはまだ機能していません。何故ですか?

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);
    }

上記の問題の理由は何ですか?

4

2 に答える 2

1

を呼び出すcat > file1.txtと、*argv[1]はではありません <。むしろ、argcは1であり、stdoutは、呼び出されるまでにすでにファイルに関連付けられていますmain。シェルを介して引数として渡したい場合は<、引用符で囲む必要があります。

$ cat '<' filename

また、の呼び出しでdup2は引数が逆になっています。 STDOUT_FILENO最初の引数ではなく、2番目の引数にする必要があります。argc==2条項fpに含める方法は、元の標準に閉じて再度開くことです。

于 2012-12-10T13:48:39.713 に答える
0

@William Pursellが言うように、リダイレクトはプログラムではなくシェルによって処理されます。そのため、プログラムは のリダイレクト記号を見ることはありませんargv[]

ただし、リダイレクトされたかどうかはテストでわかりますisatty(fd)。残念ながら、標準的な方法ではどのファイルにリダイレクトされているかを知ることはできません。たとえば、パイプとの間でリダイレクトされる可能性があります。

Linux にはハッキングの可能性があります。 /proc/$$/fd(現在の PID はどこにあるのか$$) を読み取って、fds 0、1、2 のシンボリック リンクを確認できます。ただし、これはすべての UNIX でサポートされているわけではありません。

于 2012-12-10T14:04:47.520 に答える