gpt4 book ai didi

c - 如何使用 FILE* 作为其 stdin、stdout 或 stderr 创建子进程?

转载 作者:行者123 更新时间:2023-11-30 14:34:53 24 4
gpt4 key购买 nike

如果存在一系列指向FILE数据(“object”)的FILE指针。我想创建一个子进程并将该子进程的 stdin stdout 和 stderr 设置为这些 FILE 指针。我能做什么?

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

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

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

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

我希望这个函数的功能与 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”提供了实现与上述相同的接口(interface),但需要更复杂的设置(对于此处描述的问题)。它为某些系统提供了较小的优势,因为它可以减少 fork 的开销。如果需要,请查看 man posix_spawn

关于c - 如何使用 FILE* 作为其 stdin、stdout 或 stderr 创建子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58784580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com