2014-04-27 85 views
0

在C程序,比方說,我WANN使用Exec的功能執行規定的程序,例如,如果我想只是嘗試ls -l命令,我會做一些像使用execvp與輸入,輸出和重定向

args[0]="ls"; 
args[1]="-l"; 
args[2]=NULL; 

... 
execvp("ls", args); 

這一切都很好。現在如果我想將重定向添加到文件(或stderr)呢? 我被卡住了,很明顯,在數組中加入> log.txt作爲第三項是行不通的,但我不知道如何繼續。

另外,如果我想通過一些輸入參數?如果我想執行GCC命令,例如「gcc -o out in redirection> log.txt」,該怎麼辦?

[更新自評:]

這是模擬殼一個C程序,它可以在「運行字符串」,包含一個命令,一個列表O參數,輸入和重定向串。

+0

「如果我想通過一些輸入參數怎麼辦?」 - 不是那裏的'args'數組**完全**的目的? (如果你想**輸入和輸出stdin/stdout文本,你需要'popen()'。) –

+0

可能重複[Redirect standard output to a file?](http://stackoverflow.com/questions/23135577/redirect-standard-output-to-a-file) –

+0

@OliCharlesworth在'freopen'之後是否有保證不僅流,而且文件描述符是相同的? – Deduplicator

回答

1

剛剛成立的文件描述符作爲exec -d過程必須找到他們,然後做高管。
爲此,您需要opendup2close

exec中的所有功能 - 家庭只是用您所說的任何一個替換當前進程。

+0

謝謝你的回答,我想我正在開始輸出部分。這也適用於輸入的東西?將stdIn的文件描述符更改爲文件,我想成爲(例如)gcc的input.c文件? –

+0

是的,只需設置您想讓新可執行文件繼承的任何環境。 – Deduplicator

0

運行在一個shell命令:

char * args[] = { 
    "sh", 
    "-c", 
    "ls -l >out.ls 2>err.ls <in.ls", 
    NULL 
}; 

... 

execvp(args[0], args); 
perror("execvp() failed"); 
+0

對不起,但我是新手,我沒有暗示在OP中,所有這些都必須寫在一個C程序中,這種解決方案適用於我在做什麼?我不是一個模擬可以「運行字符串」的shell的C程序,包含命令,列表o參數,輸入和重定向的字符串。假設我必須學習更多的SH事情,現在我從來沒有見過SH-C ...東西 –

+0

@ ro.nin:對於這樣的需求,* Deduplicator *的答案(http:// stackoverflow。 com/a/23322407/694576)更合適。 – alk