【问题标题】:Implementing a pipe in C?在 C 中实现管道?
【发布时间】:2012-12-03 12:08:36
【问题描述】:

我正在尝试实现一个简单的外壳。我以这种方式分叉进程:

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

感谢您的任何建议。

【问题讨论】:

    标签: c process fork pipe dup


    【解决方案1】:

    您必须在fork()ing 之前完全解析您的命令行才能启动子进程。

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

    通常您还必须使用close() 并且经常使用dup() 来使管道替换分叉进程的标准输入。

    继续阅读这些函数以“了解”大局,或获取一本涵盖 Unix I/O 的书。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-25
        • 2012-01-13
        相关资源
        最近更新 更多