1

単純なシェルを実装しようとしています。私はこのようにプロセスをフォークします:

void forkProcess(char* cmd[]) {
    pid_t pid;
    char programPath[BUFFERLENGTH] = "/bin/";
    strcat(programPath, cmd[0]);
    int exitStatus;
    pid = fork();
    switch (pid) {
    case -1:
        printf("Fork failed; pid == -1\n");
        break;
    case 0:
        execv(programPath, cmd);
        exit(0);
        break;
    default:
        waitpid(pid, &exitStatus, 0);
        //printf("Exitstatus = %d\n", WEXITSTATUS(exitStatus));
        break;
    }
}

これで、cmdパラメータにパイプが含まれる可能性があります。例:

"ls" "-l" "|" "grep" "whatever" "(char*)NULL";

では、どうすればパイプ機能を実装できますか?pipe()やのような関数があることはdup()知っていますが、このコンテキストでそれらを使用する方法がわかりません。

提案ありがとうございます。

4

2 に答える 2

1

fork()子を開始する前に、コマンドラインを完全に解析する必要があります。

パイプ演算子を使用している場合は、を呼び出す前にパイプを設定する必要があるため、パイプfork()は継承されます。

一般に、パイプをフォークされたプロセスのstdinに置き換えるためにもclose()、頻繁に使用する必要があります。dup()

これらの関数を読み続けて全体像を「把握」するか、Unix I/Oをカバーする本を入手してください。

于 2012-12-03T12:19:14.253 に答える
0

この場合、popen()を使用できます。

于 2012-12-03T12:12:50.873 に答える