簡體   English   中英

如何創建以 FILE* 作為其標准輸入、標准輸出或標准錯誤的子進程?

[英]How to create create subprocess with a FILE* as its stdin, stdout or stderr?

如果有一系列 FILE 指針指向 FILE data("object")。 我想創建一個subprocess並將這個subprocess's stdin stdout and stderr設置為這些 FILE 指針。 我能做些什么?

如果沒有這樣的function,我可以創建一個,但我不知道如何。

如果有必要,也允許訪問 FILE 的成員。

C 標准庫提供了一些頭文件,例如 m,但它們僅支持帶文件描述符的 IO 重定向。

我唯一擁有的是非空文件指針。

我希望這個 function 與 Python 中的 subprocess.run 幾乎完全相同。

int subprocess_run(char *filename, char **args, FILE *std_in, FILE *std_out, FILE *stderr);

兩種選擇:要么使用傳統的 fork(),要么使用新的 'spawn'

使用fork

int subprocess_run(char *filename, char **args, FILE *std_in, FILE *std_out, FILE *std_err);

   fflush(std_out) ;
   fflush(std_err) ;
   pid_t pid = fork() ;

   if ( !pid ) {
      // Child process, setup files, exec program, ...

      dup2(fileno(std_in)), STDIN_FILENO) ;
      dup2(fileno(std_out)), STDOUT_FILENO) ;
      dup2(fileno(std_err)), STDERR_FILENO) ;
      execvp(filename, args) ;
      perror("exevcp failed") ;

   } else if ( pid == -1 ) {
       // Error
       ...
   } else {
       // Parent
       ...
   } ;
}

請注意,根據 execvp 要求,“args”應包括程序名稱為 argv[0]。 否則,您將不得不構建新數組。

使用posix_spawn

'posix_spawn' 提供了實現與上述相同的接口,但需要更復雜的設置(對於此處描述的問題)。 它為某些系統提供了較小的優勢,因為它可以減少分叉的開銷。 如果需要,請查看man posix_spawn

暫無
暫無

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

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