1. ホーム
  2. c

[解決済み] C: `write error: フォーク、dup2、execvの後に`Bad file descriptor`が発生しました。

2022-02-04 17:55:29

質問

続きはこちら この問題 , でも、もう一度言います。

宿題で、リダイレクトを含む基本的なシェルを書かなければなりません。プログラムは readline を使って入力を促し、入力文字列を解析し、実行ファイル名、引数、および該当する場合は入出力ファイル (複数可) に分解します。文字列を解析した後、子プロセスのexecv()をフォークし、渡された実行ファイルを実行します。私は dup2() を使って、フォーク後、execv の前にファイル記述子を変更していますが、プログラムが新しい実行ファイルにexecvすると、問題が発生します。私のシェルで以下を実行すると ls > foo.out と表示されます。 ls: write error: Bad file descriptor

以下は、私の子プロセスのコードです (これは fork() の後です)。

int _child(struct command *c){
    int ret;
    /* When given `ls > foo.out`, these next two lines output:
    ** c->infile is (null)
    ** c->outfile is foo.out
    */
    printf("c->infile is %s\n",c->infile);
    printf("c->outfile is %s\n",c->outfile);
    if(c->infile){
        int fd = open( c->infile, O_RDONLY);
        int _fd_dup = dup2(fd,0);
        close(0);
        if(_fd_dup != 0){
            fprintf(stderr, "Failed to redirect command input.\n");
            return 0;
        }
    }
    if(c->outfile){
        int fd = open( c->outfile, O_WRONLY | O_CREAT | O_TRUNC, 0600);
        int _fd_dup = dup2(fd,1);
        close(1);
        if(_fd_dup != 1){
            fprintf(stderr, "Failed to redirect command output.\n");
            return 0;
        }
    }

Failed to redirect command output."というエラーは出ません。これは宿題なので、誰かに直してもらうのではなく、正しい方向性を示してほしいのです。

解決方法は?

問題はこのコードのビットにあります。

    int _fd_dup = dup2(fd,1);
    close(1);

を閉じる必要があります。 fd ではなく 1 . fd 0 の場合も同じ問題がありますね。