在C中实现管道?

时间:2012-12-03 12:08:37

标签: c process fork pipe dup

我正在尝试实现一个简单的shell。我以这种方式分叉处理:

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()等功能,但我不知道如何在这种情况下使用它们。

感谢您提出任何建议。

2 个答案:

答案 0 :(得分:1)

您必须在fork()启动孩子之前完全解析命令行。

如果正在使用管道运算符,则必须在调用fork()之前设置管道,因此它是继承的。

通常,您还必须使用close()dup()来使管道替换分叉进程的stdin。

继续阅读这些功能以“全面了解”,或者获得一本涵盖Unix I / O的书。

答案 1 :(得分:0)

在这种情况下,您可以使用popen()。