2014-06-28 64 views
1

我有一个用gets()读取输入的二进制文件。管道系统()?

我想使用我自己的程序中的system()和管道输入来执行它。这将如何成为可能?我只想做echo 'blabla' | ./a.out。现在我想基本上在C程序中执行相同的操作,在该程序中生成blabla,然后执行a.out并将其传送给它。

我不能改变第一个程序来接受命令行参数。

回答

4

我有一个用gets()读取输入的二进制文件。

请勿使用它。在任何情况下使用gets()都是不安全的。

作为对您的问题的回应,您可以使用popen()将输入输入到子流程中。

+0

谢谢你,我会在popen()的时候吃点东西。我没有在那里使用gets(),它只是一个我正在尝试编写缓冲区溢出攻击的二进制文件。 – Blub

+0

如果你想控制子进程的stdin /和/ stdout,你需要做一些更复杂的事情。创建三个管道,然后分叉。在子进程中,使用'dup2'将管道设置为stdin,stdout和stderr,然后执行你的程序。父进程可以读写管道的另一端。 – user3553031

2

请记住,system实际上运行一个shell,所以你可以执行任何你想要的shell命令,包括一个管道。除非你生成的输出需要发送循环或类似的东西,popen没有提供任何优势(特别是,它不允许你写入程序的stdin,也可以从它的stdout中读取)。所以你可以像这样使用system

// generate the string you want to send 
char str[256] = "blabla"; 

// sprintf it into a command string 
char cmd[256]; 
sprintf(cmd, "echo '%s' | ./a.out", str); 

// send the command string to system 
system(cmd);