替代popen管道来执行程序和读取输出

时间:2012-06-11 17:03:52

标签: c++ popen

请为popen()提供良好的替代方案来执行shell命令,然后阅读输出。

编辑:替代方案必须没有fork()来电。因为我的服务器已经占用了太多内存。然后ffmpeg还需要内存和进程大小增加!我每次都会向fork()的内存权重服务器发出问题。

2 个答案:

答案 0 :(得分:4)

如果您担心在分叉时复制父进程的内存,那么您需要使用vfork() - 一个特殊版本的“fork”,它不复制父进程的内存但需要forked进程立即发出execve()

答案 1 :(得分:0)

这就是我在学校的教学方式:

int main(int argc, char *argv[]) {

    int pipefd[2];
    pid_t cpid;
    char buf;


    if (pipe(pipefd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    cpid = fork();
    if (cpid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (cpid == 0) {
        /* Child reads from pipe */
        close(pipefd[1]);

        //make the standard input to be the read end
        pipefd[0] = dup2(pipefd[0], STDIN_FILENO);

        system("more");

        write(STDOUT_FILENO, "\n", 1);
        close(pipefd[0]);


    } else {

        /* Parent writes argv[1] to pipe */
        close(pipefd[0]);
        /* Close unused read end */

        pipefd[1] = dup2(pipefd[1], STDOUT_FILENO);

        system("ps aux");
        /* Wait for child */
        wait(NULL);
        exit(EXIT_SUCCESS);
    }

    return 0;
}

这会产生两个进程,一个执行“ps aux”并将输出提供给运行“more”的另一个进程。