替代为POPEN管执行程序和读取输出(Alternative for popen pipe to e

2019-09-18 00:15发布

拜托,建议为好替代popen()执行shell命令,然后读取输出。

编辑:替代必须是无fork()调用。 因为我的服务器已经花费了太多的内存。 随后ffmpeg也需要内存和进程大小增加! 而我得到的问题fork()每次内存权重的服务器。

Answer 1:

如果担心复制分叉当父进程的内存,那么你需要使用vfork() - “叉”不复制父进程的内存,但是需要的分叉过程中立即发出的一个特殊版本execve()



Answer 2:

这是我在学校的教导:

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”和进给输出到运行的“更多”的另一个。



文章来源: Alternative for popen pipe to execute program and read the output
标签: c++ popen