[英]How to redirect the output of system() to a file?
stdout
是標准輸出流的FILE *
指針。 dup2
需要文件描述符,您也弄亂了參數順序。 采用
dup2(file, 1);
代替。
在更好的方式去做這部分。 這種方法很糟糕,因為您可能要在此system
調用完成后恢復標准輸出。 您可以通過多種方式執行此操作。 您可以dup
某處,然后dup2
回來(並關閉dup
PED一個)。 我個人不喜歡其他答案中所建議的編寫自己的cat
實現。 如果您唯一想做的就是將帶有system
的單個shell命令重定向到文件system
中的文件,那么最直接,最簡單的方法就是構造shell命令來執行此操作
system("ls -l > Result");
但是,如果文件名(結果)來自用戶輸入,則必須小心,因為用戶可以提供類似'Result; rm -rf /*'
'Result; rm -rf /*'
作為文件名。
同樣,關於安全性,您應該考慮按照注釋中的建議指定ls
的完整路徑:
system("/bin/ls -l > Result");
簡單的事情是使用>
實際上:
#include <stdio.h>
int main()
{
system("ls -l > /some/file");
return 0;
}
一種替代方法是使用popen()
,類似
#include <stdio.h>
#include <stdlib.h>
main()
{
char *cmd = "ls -l";
char buf[BUFSIZ];
FILE *ptr, *file;
file = fopen("/some/file", "w");
if (!file) abort();
if ((ptr = popen(cmd, "r")) != NULL) {
while (fgets(buf, BUFSIZ, ptr) != NULL)
fprintf(file, "%s", buf);
pclose(ptr);
}
fclose(file);
return 0;
}
您應該使用popen()
庫函數,並從返回的FILE *
讀取數據塊,並將其寫入所需的任何輸出文件中。
參考 。
使用dup
而不是dup2
。 dup
創建一個別名文件描述符,該值應始終是最小的可用文件描述符。
new_fd = dup(file);
-在此語句中, file
的值可能為3
(因為stdin
為0
, stdout
為1
, stderr
為2
)。 所以new_fd
將是4
如果要將stdout
重定向到文件。 然后執行以下操作。
close(stdout);
new_fd = dup(file);
現在,DUP將返回1作為別名file
描述符,因為我們關閉stdout
,從而打開文件描述符是0,2,3
和1
是最小的可用文件描述符。
如果使用的是dup2
手段,則dup2(file,1);
-像這樣
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.