gpt4 book ai didi

objective-c - 如何轻松重定向 NSTextView 中的控制台输出?

转载 作者:行者123 更新时间:2023-12-03 17:32:45 25 4
gpt4 key购买 nike

假设您有一个 Cocoa 应用程序的代码,它通过 NSlogs 和 printfs 将自己的消息记录到控制台输出。我的目标是将所有这些输出重定向到 NSView 中的单独 NSWindow 中。

我怎样才能以这样的方式实现这一目标

  • 最大限度地减少需要重写的代码量
  • 可以恢复
  • 最大限度地重用书面代码

(通常的软件工程指南)?

最佳答案

  1. 程序启动后不久,使用 dup(2) 调用为 fd 1(stdout)和 2(stderr)创建重复的文件描述符。保存返回值供以后使用。

  2. 对 FD 1 和 FD 2 调用 close(2)。

  3. 调用 openpty(2) 两次。返回的第一个主设备应该是 FD 1(因为它是第一个可用的 FD),第二个主设备应该是 2。保存两个从设备 FD 以供以后使用。不用担心保存名称参数。现在,每当您的程序 printf(2) 到 stdout,或 NSLogs 到 stderr 时,数据都会写入您的从属 FD。

  4. 现在您必须选择是要轮询从属 FD 还是在有数据要读取时设置信号。

使用 NSTimer 进行轮询。在你的计时器中,在你的两个从 FD 上使用 select(2) 来查看它们是否有数据。如果他们确实读取了(2)它,然后将其输出到您的窗口。您还可以让两个从机 FD 使用非阻塞 IO(使用 fcntl(2) 将从机 FD 设为 F_SETFL 为 O_NONBLOCK)。那么你不需要 select(2),你只需要 read(2) ,如果没有什么可读的,它将返回零。

对于信令,使用 fcntl(2) 将从站 FD 设为 F_SETFL 至 O_ASYNC。然后使用 signal(3) 为 SIGIO 安装信号处理程序。当调用信号处理程序时,请使用我在轮询部分中描述的两种方法之一。

如果在运行时您想放弃所有这些更改并将一切设置恢复正​​常,请执行以下操作:

  1. 对 FD 1 和 FD 2 调用 close(2)。

  2. 对上面第一部分步骤 1 中保存的两个 FD 调用 dup(2)。以正确的顺序执行 dup(2),以便 stdout 使用 FD 1,stderr 使用 FD 2。

现在写入 stdout 和 stderr 的任何内容都将转到原始 FD。

关于objective-c - 如何轻松重定向 NSTextView 中的控制台输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3996110/

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