c-如何创建以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);

两个选项:要么使用传统的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_spown"提供了与上述相同的接口,但需要更复杂的设置(针对此处描述的问题(。它为某些系统提供了较小的优势,因为它可以减少分叉的开销。如果需要,请查看man posix_spawn

相关内容

  • 没有找到相关文章

最新更新