如何在iOS中重定向标准输出?

如何在iOS中重定向标准输出?,ios,objective-c,stdout,Ios,Objective C,Stdout,我正在将一些遗留代码导入一个iOS应用程序,该应用程序使用stdout进行一些诊断输出。当然,我需要得到输出。我想将此输出重定向到一个文件,然后再次使用相同的遗留代码,将输出重定向到另一个文件。有人知道这样做的方法吗 我试过简单化的方法 freopen(p, "w", stderr); 这确实管用——但只管用一次。使用此调用后,将永远重定向到stdout的所有输出。这没关系,但随后将输出重定向到新位置的调用会导致系统不稳定,最终导致崩溃。(我已经在XCode上运行过测试

我正在将一些遗留代码导入一个iOS应用程序,该应用程序使用stdout进行一些诊断输出。当然,我需要得到输出。我想将此输出重定向到一个文件,然后再次使用相同的遗留代码,将输出重定向到另一个文件。有人知道这样做的方法吗

我试过简单化的方法

            freopen(p, "w", stderr);
这确实管用——但只管用一次。使用此调用后,将永远重定向到stdout的所有输出。这没关系,但随后将输出重定向到新位置的调用会导致系统不稳定,最终导致崩溃。(我已经在XCode上运行过测试,但不是直接从重新启动的iPad上运行。我不知道如果不使用调试模式在XCode上运行,不稳定性是否会持续。)

我也试过这种方法。这也可以工作,但不会将系统恢复到其原始状态,而且只能工作一次。(如果您在家里尝试此功能,请使用苹果的
而不是
,并将
\uuu
等通话中的
\udup
\udup2
关闭)

我真的不想为了使用显式文件而必须遍历代码并替换
printf
的所有用法。除了耗时、易出错和丑陋之外,代码是开源的。我不希望原始作者会欣赏我的更改,我也不想每次更新原始项目时都重新整合这些更改


想法?

您使用
dup
链接的方法是实现这一点的标准方法,答案中给出的代码会在之后还原文件描述符1,这并不总是必需的。此外,这些更改是在树的每个进程的基础上进行的(由子进程继承,但不影响父进程)。鉴于不清楚您所说的“不会将系统恢复到其原始状态,而且只能工作一次”的含义。你能在你想做什么和看到什么的问题上给出更多的细节吗?这可能有助于某人给出答案。在使用XCode的iOS下运行时,将标准输出返回到其原始设置不会导致使用printf()打印的文本进入XCode控制台。系统也不稳定,;重置标准输出后,我看到程序间歇性崩溃。这些肯定是不可预测的,但如果我不重定向stdout,它们确实会消失。