如何在C中模拟程序的键盘输入

时间:2012-04-05 11:50:50

标签: c ipc iostream stdio

我有一个程序的二进制文件,它等待使用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程序的一个二进制的键盘输入?

5 个答案:

答案 0 :(得分:5)

这不是你正在寻找的程序,它是你的shell的功能:

 program < input.txt

这样你就可以将input.txt作为stdin推送到程序。

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

答案 1 :(得分:1)

在将程序作为基本度量调用时,您可以使用简单的pipe

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

您可以通过fork程序执行后者并使用父进程创建管道,并使用文件描述符将子进程重新打开stdin(偶数stdout)管道和exec您想要提供输入的程序。

有关管道this文件描述符,请参见this(因为创建pipe只会为您提供文件描述符)。

P.S。:很抱歉目前无法提供代码,但我不是在UNIX工作站附近,在UNIX OS编程上有点太生疏,无法从内存中编写可靠的代码。

答案 2 :(得分:1)

我不是百分百肯定,但是如果你使用一个exec函数从你的C代码启动你的二进制程序它应该工作。因为是的,很难解释)。有关更多信息,请尝试手册页:

man 3 exec

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

答案 3 :(得分:0)

如果由于某种原因不想在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;
}

答案 4 :(得分:-1)

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

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

希望这会有所帮助。