当输出重定向到NSPipe对象时,应用程序的行为会有所不同吗?

时间:2010-08-27 20:05:31

标签: objective-c macos sockets foundation cfnetwork

我有一个适用于套接字和读/写数据的应用程序。它使用基础框架与 CFNetwork stdio 结合使用。

这是问题 - 当它从控制台(bash shell)启动时,它可以100%正常运行并且没有任何问题。但是当它被另一个应用程序通过NSTask调用时,疯狂开始了。整个应用程序变得疯狂,它只读取套接字一次然后挂起(它意味着在完成后退出)。

此应用程序不依赖于环境变量或任何其他类似的东西。它也不是用户问题。当它启动时,它向服务器发送一个简单的请求,并且“ printf ”响应并再次读取。发生这种情况,直到收到终止数据包。

我真的很困惑,感觉框架内部有一些东西会让app疯狂只是为了让程序员失望。

顺便说一下,我正在使用 Mac OS X Snow Leopard ,该应用程序适用于同一平台。

编辑1: 标准输出重定向到 NSPipe 会导致它。但为什么呢?

1 个答案:

答案 0 :(得分:0)

libc以不同方式处理管道/文件和连接到(伪)终端的控制台。特别是,默认缓冲策略是不同的。请参阅广泛的讨论in this Stack Overflow Q&A

因此,完全可以想象,当连接到(伪)终端时工作的程序不能用于管道。如果您需要更具体的建议,您需要发布(至少是您的代码的骨架)。