gpt4 book ai didi

c - 重定向子进程的输出

转载 作者:行者123 更新时间:2023-12-04 13:03:21 29 4
gpt4 key购买 nike

有几种方法可以重定向子进程的输出:

  1. 使用 freopen(3)
  2. 使用 dup(3)
  3. 使用 popen(3)
  4. ...

如果只需要执行一个子进程并将其输出保存在给定文件中,那么应该选择什么,这与 ls > files.txt 的工作方式非常相似?

shell 通常使用什么?

最佳答案

您可以通过 strace(1)ing 您的 shell 来发现您最喜欢的 shell 使用什么。

在一个终端中:

echo $$

在另一个终端:

strace -o /tmp/shell -f -p [PID from the first shell]

再次在第一个终端中:

ls > files.txt

在第二个终端中,^C 你的 strace(1) 命令,然后编辑 /tmp/shell 输出文件看看是什么系统调用它进行重定向。


freopen(3) 操作 C 标准 IO FILE* 指针。所有这些都将在 execve(2) 调用的另一端被丢弃,因为它保存在用户内存中。您可以在 execve(2) 调用之后使用它,但一般使用起来会很尴尬。

popen(3) 打开一个单向 pipe(7)。这很有用,但非常有限——您将获得标准输出描述符 标准输入描述符。对于 ls | 这样的东西,这会失败。 grep foo | sort 必须重定向输入和输出。所以这是一个糟糕的选择。

dup2(2) 将管理文件描述符——一种内核实现的资源——因此它将在 execve(2) 调用 您可以根据需要设置任意数量的文件描述符,这对于 ls >/tmp/output 2>/tmp/error 或同时处理输入 输出非常有用: ls |排序 | uniq.

还有另一种机制:pty(7) 处理。 forkpty(3)openpty(3) 函数可以管理专门为处理另一个程序而创建的新伪终端设备。 Advanced Programming in the Unix Environment, 2nd edition book在其源代码中有一个非常好的 pty 示例程序,但如果您无法理解为什么这会有用,请查看 script(1) 程序-- 它创建了一个新的伪终端,并用它来记录程序的所有输入和输出,并将抄本存储到文件中以供以后播放或记录。您还可以使用它来编写交互式程序中的脚本操作,类似于 expect(1)

关于c - 重定向子进程的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8556286/

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