2014-06-28 83 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);