【问题标题】:How to create create subprocess with a FILE* as its stdin, stdout or stderr?如何创建以 FILE* 作为其标准输入、标准输出或标准错误的子进程?
【发布时间】:2019-11-09 23:48:37
【问题描述】:

如果有一系列FILE指针指向FILE data("object")。我想创建一个subprocess 并将这个subprocess's stdin stdout and stderr 设置为这些文件指针。我能做什么?

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

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

C 标准库提供了一些头文件,例如 m ,但它们只支持带有文件描述符的 IO-redirect。

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

我希望这个函数与 Python 中的 subprocess.run 几乎完全相同。

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

【问题讨论】:

  • popen(),但它只提供标准输入或输出,而不是两者。
  • @Shawn,我知道这一点,但它是通过 shell 完成的,出于安全原因,我想通过禁用 shell 来实现。

标签: c file io subprocess stdio


【解决方案1】:

两种选择:要么使用传统的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多