打开具有完整功能的cmd程序(i / o)

时间:2014-08-06 13:12:25

标签: c pipe popen

我尝试了popen(),它适用于以"r"作为第二个参数传递的输出;我知道你可以使用"w"作为写作模式,它对我有用(程序只有一个scanf())。我的问题是如何使用追加("a")模式。您可以同时编写和阅读,如何知道程序何时输出内容以及何时请求用户输入?

1 个答案:

答案 0 :(得分:2)

popen使用管道(“popen”中的“p”),管道是单向的。您可以从管道的一端读取或写入,而不是两者都读取或写入。要获得读/写访问权限,您应该使用套接字对。当我想要像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 ......)