如何使用FILE *作为其stdin,stdout或stderr创建create子进程?

是否存在一系列指向FILE数据(“对象”)的FILE指针。我想创建一个subprocess并将此subprocess's stdin stdout and stderr设置为这些FILE指针。我该怎么办?

如果没有这样的功能,我可以创建一个,但是我不知道怎么做。

如有必要,还允许访问FILE的成员。

C标准库提供了一些标头,例如m,但是它们仅支持带有文件描述符的IO重定向。

我唯一拥有的是非空FILE指针。

我希望此功能与Python中的subprocess.run几乎完全相同。

int subprocess_run(char *filename,char **args,FILE *std_in,FILE *std_out,FILE *stderr);
huang346197 回答:如何使用FILE *作为其stdin,stdout或stderr创建create子进程?

两个选项:使用传统的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

本文链接:https://www.f2er.com/3130878.html

大家都在问