3

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

4

5 回答 5

7

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

 program < input.txt

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

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

于 2012-04-05T11:53:48.020 回答
2

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

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

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

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

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

于 2012-04-05T12:04:07.543 回答
1

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

man 3 exec

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

于 2012-04-05T12:51:46.787 回答
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;
}
于 2012-04-05T12:30:20.850 回答
-1

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

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

希望这会有所帮助。

于 2012-04-05T11:58:49.497 回答