【问题标题】:how to simulate keyboard input for a program in C如何在C中模拟程序的键盘输入
【发布时间】:2012-04-19 03:50:02
【问题描述】:

我有一个程序的二进制文件,它使用 scanf 等待输入。我需要编写一个能够模拟键盘输入的 C 代码。即关闭该二进制文件的标准输入指针,而是将其重新指向文件。 我用了这段代码

int main()
{
        FILE *fin;
        int result;
        char string[80];
        close(0);

        fin = fopen("text", "r");

        if(NULL == fin)
        {
                printf("Unable to open file.");
                return 0;
        }
        dup(fin);
        return 0;
}

但我发现每个程序都有自己的标准输入指针。有没有办法让我模拟 来自另一个 C 程序的一个二进制文件的键盘输入?

【问题讨论】:

  • 我只有第一个程序的二进制文件,所以我不能更改它的代码,我只需要 scanf 从文件而不是键盘缓冲区读取。 :/帮助?
  • 从提问到发表评论不到一分钟。 :/耐心?

标签: c ipc iostream stdio


【解决方案1】:

这不是您要寻找的程序,而是您的 shell 的功能:

 program < input.txt

这样你就可以将 input.txt 作为标准输入推送到程序中。

如果你想要一个程序,那么你可以运行一个程序并将它的输出重新路由到其他程序的输入。

【讨论】:

  • 所以你说要写一个shell脚本?你能详细说明你的回答吗?我不明白......对不起:/
  • 您的答案中的“程序”是什么?是程序ID吗?还是那是执行它的方式?它是否总是从文件而不是键盘输入,因为我的二进制文件需要多次输入?
  • 你,先生,是个天才……我是个白痴!我已经这样做了大约一百万次以将输出重定向到一个文件,我从来没有想过我可以对输入做同样的事情......谢谢!
【解决方案2】:

在调用程序时,您可以使用简单的pipe 作为基本措施。

另一种方法是让您的键盘模拟器充当启动器。它应该以stdin 作为模拟器的stdout 启动您正在测试的程序。

你可以通过fork你的程序来完成后者,并使用父进程创建一个管道,子进程使用该管道的文件描述符和exec重新打开stdin(甚至stdout)您要向其提供输入的程序。

管道this文件描述符this(因为创建pipe只会给你一个文件描述符)。

P.S.:很抱歉目前无法提供代码,但我离 UNIX 工作站不远,而且对 UNIX 操作系统编程有点生疏,无法从内存中编写可靠的代码。

【讨论】:

    【解决方案3】:

    我不能 100% 确定,但是如果您使用 exec 函数之一从 C 代码启动二进制程序,它应该可以工作。因为因为是的,所以很难解释)。有关更多信息,请尝试手册页:

    man 3 exec
    

    大多数时候 exec* 与 fork 一起使用,但在你的情况下,我认为你不需要 fork。

    【讨论】:

      【解决方案4】:

      如果您出于某种原因不想在 shell 中使用此功能,则可以关闭标准输入文件描述符,然后打开要从中读取的文件。它将获得刚刚关闭的 fd 的编号,这很可能也是您的 shell 实现重定向的方式。

      #include <stdio.h>
      #include <unistd.h>
      #include <fcntl.h>
      
      int main(void)
      {
          int fd;
          char buf[128];
      
          close(STDIN_FILENO);
      
          fd = open("./testfile", O_RDONLY);
          if(fd < 0) return 1;
      
          scanf("%127[ a-z0-9]", buf);
          puts(buf);
      
          close(fd);
          return 0;
      }
      

      【讨论】:

        【解决方案5】:

        Shell 是为终端会话提供命令提示符的程序。它支持一种简单的编程语言,如其Wiki article 中所述。

        一般来说,当您看到一个不熟悉的术语时,维基百科和搜索引擎会成为强大的盟友。使用它们,生活会很快变得更好——你的知识也会成倍增长。

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-27
          • 2012-02-04
          • 1970-01-01
          • 1970-01-01
          • 2020-06-10
          • 2020-02-13
          • 1970-01-01
          • 2012-09-21
          相关资源
          最近更新 更多