我有一个程序的二进制文件,它等待使用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程序的一个二进制的键盘输入?
答案 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中所述。
一般来说,当你看到一个不熟悉的术语时,维基百科和搜索引擎就会成为强大的盟友。使用它们,生活将很快变得更好 - 你的知识将呈指数级增长。
希望这会有所帮助。