2011-06-27 247 views
2

如何將execlp輸出重定向到文件?例如,我想將execlp("ls", "ls", "-l", NULL)的輸出重定向到輸出文件(比如說a.txt)。將execlp輸出重定向到文件

+0

你確定嗎?這些功能*用新的功能取代當前的過程。 –

+0

是的,我可以使用'fork'創建一個子進程。 – miraj

+0

@miraj:嗯,執行進程將繼承調用進程的文件描述符,因此您可以使用各種'fd *'函數關閉並重新打開文件描述符1(stdout)。 –

回答

1

要做到這一點是使用freopen函數打開一個新的文件,標準輸出的最簡單方法:

FILE * freopen函數(爲const char *限制的文件名,爲const char *限制模式, FILE *限制流);

從手冊頁的fopen(包括freopen函數):

調用freopen()函數打開文件 ,其名稱是字符串指出 通過文件名和相關聯的流指向與它流。 原始流(如果存在)已關閉。模式參數 是 ,就像在fopen()函數中一樣。

所以,你的情況,是這樣的:

#include <stdio.h> 
FILE *myStdOut; 
myStdOut = freopen("a.txt", "rw", stdout); 
if (myStdOut == NULL) 
    // Error case, open failed 

的細節可能會有所不同,從操作系統到操作系統和編譯器版本。

+0

'freopen'不是這個的正確工具。甚至不保證使用相同的文件描述符編號,並且基本上不應該在POSIX程序中使用。 –

+0

永遠不會在POSIX程序中使用,我的意思是從來沒有在使用裸ANSI/ISO C之外的POSIX功能的程序中,也就是說,使用'freopen'重定向'stdout'完全可以在你自己的進程中使用'stdio'輸出,但如果您在進程和新程序映像之間混合文件描述符io或文件描述符的繼承,則不適用。 –

+0

如何關閉myStdOut? – miraj

5

你需要做的是這樣的:你想用`EXEC *`

int fd = open("output_file", O_WRONLY|O_CREAT, 0666); 
dup2(fd, 1); 
close(fd); 
execlp("ls", "ls", "-l", (char *)0); 
+0

如果子進程執行上述部分(打開文件,關閉文件並運行execlp),那麼一旦子進程終止,是否可以從父進程讀取創建的文件,而不會有任何同步問題。 – miraj

+0

是的。只需「等待」讓孩子終止,以便知道書寫完成的時間。或者,您可以使用「pipe」並在數據生成時讀取數據,而不必將其存儲到文件中 - 如果可能的話,這通常是可取的。 –

+1

它確實有效。非常感謝。 – miraj