繁体   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