当输出重定向到 NSPipe 对象时,应用程序的行为是否有所不同?
我有一个使用套接字并读取/写入数据的应用程序。它使用Foundation框架结合CFNetwork和stdio。
问题是——当它从控制台(bash shell)启动时,它工作 100% 正常,没有任何问题。然而,当另一个应用程序通过 NSTask 调用它时,疯狂就开始了。整个应用程序变得疯狂,它只读取套接字一次,然后挂起(意味着完成后退出)。
该应用程序不依赖于环境变量或任何其他类似的东西。这也不是用户的问题。当它启动时,它会向服务器发送一个简单的请求,并打印响应并再次读取。这种情况会一直发生,直到收到终止数据包为止。
我真的很困惑,感觉框架内有一些东西让应用程序变得疯狂,只是为了惹恼程序员。
顺便说一句,我使用的是 Mac OS X Snow Leopard,并且该应用程序适用于同一平台。
编辑1:将stdout重定向到NSPipe会导致它。但为什么 ?
I have an application which works with sockets and reads / writes data. It uses Foundation framework combined with CFNetwork and stdio.
Here is the issue - when it is launched from console (bash shell) it works 100% fine and there is nothing wrong with. However when it is invoked by another application via NSTask madness begins. The whole application goes insane and it only reads the socket once and then hangs up (it is meant to exit after it is done).
This application does not rely on environmental variables or any other things like that. It is not a user issue either. When it is launched it sends a simple request to the server and 'printf's the response and reads again. This happens untill a termination packet is recieved.
I am really confused, and it feels like there is something inside the framework which makes the app insane just to piss the programmer off.
By the way, I'm on Mac OS X Snow Leopard and the application is for the same platform.
EDIT 1 : Redirecting stdout to an NSPipe causes it. But why ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
libc 以不同的方式对待连接到(伪)终端的管道/文件和控制台。特别是默认的缓冲策略是不同的。请参阅此 Stack Overflow 问答中的广泛讨论。
因此,完全可以想象,连接到(伪)终端时可以运行的程序将无法使用管道运行。如果您需要更具体的建议,您需要发布代码(至少是框架)。
libc
treats a pipe/file and a console connected to a (pseudo) terminal differently. In particular, the default buffering policy is different. See the extensive discussion in this Stack Overflow Q&A.So, it's perfectly conceivable that a program which works when connected to a (pseudo) terminal won't work with a pipe. If you need more specific advice, you need to post (at least the skeleton of) your code.