-1

Cでシェルを実装しています。これは、パイプに使用する関数です。コードに "ls | a" を入力すると (つまり、有効なコマンドを無効なコマンドでパイプ処理する)、本来のように子プロセスを終了しません。メイン関数に戻すにはどうすればよいですか? ps | を実行すると同じことが起こります。ls または ps | pwd などですが、ls | ps は bash と同じように機能します。私はlsを知っています | ps または ps | ls は意味がありませんが、少なくとも bash と同じ出力が得られるはずです。

void exec3(char **args, char **args2){
    int fd[2];
    pid_t pid,pid1;
    int status;
    pipe(fd);
    int e=0;
    if ((pid = fork()) < 0) {    
        printf("*** ERROR: forking child process failed\n");
        exit(1);
    }

    else if ((pid1 = fork()) < 0) {    
        printf("*** ERROR: forking child process failed\n");
        exit(1);
    }

    else if (pid == 0 && pid1!=0){   
        printf("in 1\n");
        close(1);
        dup(fd[1]);
            close(fd[0]);
        close(fd[1]);

            if(execvp(args[0],args)<0){
                printf("**error in exec");
                close(fd[0]); 
                close(fd[1]);           
                exit(1);
            }
    //printf("exiting 1\n");
    exit(0);
}

else if (pid1 == 0 && pid!=0) {   
    printf("in 2\n");
    close(0);
    dup(fd[0]);
    close(fd[1]);
    close(fd[0]);
    if((e=execvp(args2[0],args2))<0){
            printf("**error in exec2 ");
            close(fd[0]);
            close(fd[1]);

        exit(1);
    }
    exit(0);
}

else {  
        close(fd[0]);
        close(fd[1]);
        fflush(stdout) ;             
        while (wait(&status) != pid);
        while (wait(&status) != pid1);
    }  
}
4

1 に答える 1

-1

あなたは解決に近づいています。がどのようpopen() に実装されているかを見てください。それがあなたがやろうとしていることです。

于 2012-11-16T19:20:29.267 に答える