簡體   English   中英

如何將system()的輸出重定向到文件?

[英]How to redirect the output of system() to a file?

在這個C程序中

#include <stdio.h>
#include <fcntl.h>
int main()
{
    int file = open("Result", O_CREAT|O_WRONLY, S_IRWXU);

    dup2(stdout, file);
    system("ls -l");

    return 0;
}

我正在嘗試將system()的輸出重定向到文件,因為我已經使用過dup2,但是它不起作用。

此代碼有什么問題
並且,請告訴我是否有更好的方法可以做到這一點 (不使用終端上的>

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 (因為stdin0stdout1stderr2 )。 所以new_fd將是4

如果要將stdout重定向到文件。 然后執行以下操作。

close(stdout);
new_fd = dup(file);

現在,DUP將返回1作為別名file描述符,因為我們關閉stdout ,從而打開文件描述符是0,2,31是最小的可用文件描述符。

如果使用的是dup2手段,則dup2(file,1); -像這樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM