如果有一系列指向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
。