如何在C语言中模拟键盘输入给程序

3

我有一个程序的二进制文件,它使用scanf等待输入。我需要编写C代码来模拟键盘输入。也就是关闭该二进制文件的stdin指针,然后将其重新指向一个文件。我使用了以下代码:

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;
}

但我发现每个程序都有自己的stdin指针。有没有办法让我从另一个C程序中模拟键盘输入,以供一个二进制程序使用?


我只有第一个程序的二进制文件,所以无法更改其代码,我只需要将scanf从键盘缓冲区更改为从文件读取。:/ 能帮忙吗? - user434885
提问和评论之间仅需不到一分钟,您能耐心等待吗? :/ - Puppy
5个回答

8

你要找的不是一个程序,而是你的shell的功能:

 program < input.txt

将input.txt作为标准输入推送到程序中。

如果你想要一个程序,那么你可以直接运行一个程序,并将其输出重定向到其他程序的输入。


那么您是说要编写一个Shell脚本?您能详细说明一下您的回答吗?我不明白...抱歉 :/ - user434885
你回答中的“程序”是指什么?是程序ID吗?还是执行它的方式?它是否总是从文件而不是键盘获取输入,因为我的二进制文件需要多次输入? - user434885
2
您,先生,真是个天才...而我则是个白痴!我已经做了无数次将输出重定向到文件的操作,从未想过我也可以用同样的方式处理输入...谢谢您! - user434885

2
您可以在调用程序时使用简单的管道作为基本措施。
另一种方法是使您的键盘模拟器充当启动器。它应该以您的模拟器的stdout作为stdin启动您正在测试的程序。
您可以通过fork您的程序并使用父进程创建一个管道,然后使用子进程重新打开stdin(甚至stdout)使用文件描述符连接到该管道,并exec想要提供输入的程序来实现后者。
请参见this了解管道this了解文件描述符(因为创建管道只会给您一个文件描述符)。
附言:很抱歉目前无法提供代码,但我离UNIX工作站很远,而且对UNIX操作系统编程有点生疏,无法从记忆中编写可靠的代码。

1

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

man 3 exec

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


0

如果由于某种原因不想在shell中使用该功能,您可以关闭标准输入文件描述符,并打开要从读取的文件。它将获得刚关闭的文件描述符的编号,这很可能是您的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;
}

-1

Shell是提供终端会话命令提示符的程序。它支持一种简单的编程语言,如其维基百科文章所述。

通常情况下,当您遇到不熟悉的术语时,维基百科和搜索引擎成为强大的盟友。利用它们,生活将迅速变得更好,您的知识也将呈指数增长。

希望这能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接