【问题标题】:Open a cmd program with full functionality (i/o)打开具有完整功能的 cmd 程序 (i/o)
【发布时间】:2014-09-29 10:43:51
【问题描述】:

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

【问题讨论】:

  • 在什么操作系统上?
  • 哦,如果你想读写,你可以使用popen
  • 你需要打开两个单独的管道——一个用于程序的stdin,一个用于stdout
  • 相关(不确定是否有帮助):stackoverflow.com/q/3884103/509868
  • 如果您在 Windows 中,请尝试 CreateProcess api。它可以同时处理读管道和写管道。

标签: c pipe popen


【解决方案1】:

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...)

【讨论】:

  • 刚刚注意到您使用的是 Windows;那里没有 socketpair() 。可能也没有 /bin/sh 。您可能应该像上面 cmets 中推荐的其他人一样使用 CreateProcess。
猜你喜欢
  • 1970-01-01
  • 2021-04-02
  • 2017-03-26
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
相关资源
最近更新 更多