我尝试过popen()并且它在输出时运行良好,并将"r"作为第二个参数传递;我知道您可以使用"w"作为编写模式,它对我也很有效(程序只是一个scanf())。我的问题是如何使用append("a")模式。你既可以写也可以读,你怎么知道程序什么时候输出什么,什么时候请求用户输入?

最佳答案

popen使用管道(即“popen”中的“p”),管道是单向的。你可以从管道的一端读或写,不能同时从两端读或写。要同时获得读/写访问权限,应该改用socketpair。当我想要像popen这样的东西时,我会在程序中使用它,但是用于读/写:



    #include <sys/types.h>
    #include <sys/socket.h>
    #include <stdio.h>
    #include <unistd.h>

    FILE *sopen(const char *program)
    {
        int fds[2];
        pid_t pid;

        if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0)
            return NULL;

        switch(pid=vfork()) {
        case -1:    /* Error */
            close(fds[0]);
            close(fds[1]);
            return NULL;
        case 0:     /* child */
            close(fds[0]);
            dup2(fds[1], 0);
            dup2(fds[1], 1);
            close(fds[1]);
            execl("/bin/sh", "sh", "-c", program, NULL);
            _exit(127);
        }
        /* parent */
        close(fds[1]);
        return fdopen(fds[0], "r+");
    }


请注意,由于它不返回子的PID,在子程序退出后,将有一个僵尸进程。(除非你设置了SIGCHLD…)

10-07 15:33