问题标签 [nspipe]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - 来自我无法控制的进程的 NSPipe 输入
我有一个用 Objective-C 编写的应用程序,并试图从用 C 编写的应用程序接收消息。看来我有两个选择...... XPC 服务和管道。关于 NSPipe - 我正在尝试确定如何打开一个管道来监视给定位置的文件以获取新数据。简单地说,我需要知道新数据何时写入路径 XYZ 的文件。然而,我在 NSPipe 中找到的所有示例似乎都在相互通信的任务中,并且所有这些任务都由同一个中央应用程序产生和拥有......所以他们从不指定要观看的文件。相反,他们只是将一个进程的输入分配为另一个进程的输出。由于我不拥有基于 C 的应用程序,因此我不能只将该 C 程序的输出分配为我拥有的任务的输入。相反,我希望将数据写入文件,并且需要知道它什么时候到达。我怎样才能做到这一点?
swift - 我如何判断 FileHandle 何时没有任何内容可供阅读?
我正在尝试使用 aPipe
来fileHandleForReading
读取readabilityHandler
astandardOutput
和standardError
a Process
。但是,terminationHandler
调用的时刻实际上是在第一次调用my 的时刻之前readabilityHandler
。
我不确定进程为什么要这样做,但这意味着我没有获取所有数据,因为我假设进程终止意味着所有输出都已刷新到管道。既然不是这样,有没有办法告诉我什么时候没有更多的输出可供读取?我认为这涉及检查 aFileHandle
是否仍然打开,但我没有看到用于此的 API。
这是我的代码的基本概念的示例:
swift - Swift:用管道缓冲一个很长的参数到`Process`
问题
我正在尝试从我的 Swift 可执行文件中调用 Python 函数。
这工作得很好,直到参数变得太长并且我开始收到错误:
未捕获的异常
NSInternalInconsistencyException
原因:'无法 posix_spawn:错误 7'
这本质上意味着我发送 python 代码进行处理的数据(我的论点)太长了。
最后的选择
最明显的解决方案是将数据写入文件并将脚本发送到包含数据的文件的路径。这带来了明显的性能限制。
一个可能更好的选择
这就是我需要帮助的地方:我认为可以缓冲这些数据,而不是将其全部发送到一个块中。
我已经尝试使用许多不同的关键字组合对此进行研究,并且过去一天一直在网上阅读许多文章,但没有人回答我的问题:是否可以缓冲数据以绕过ARG_MAX
大约 260000 字节的内核限制使用Process
es 和Pipe
s?
编码
因为它总是有助于查看我当前用于调用 Python 函数的代码,所以这就是我所拥有的:
稍后:
macos - NSTask 结束后如何读取 readInBackgroundAndNotify 的所有剩余输出?
我正在通过NSTask
. 这些工具可能会运行几秒钟,并不断将文本输出到stdout
. 最终,该工具将自行终止。我的应用程序使用readInBackgroundAndNotify
.
如果我在工具退出后立即停止处理异步输出,我经常会丢失一些到那时尚未交付的输出。
这意味着我必须再等一会儿,让 RunLoop 处理待处理的读取通知。当我阅读了该工具写入管道的所有内容时,如何判断?
这个问题可以在下面的代码中通过删除runMode:
调用行来验证 - 然后程序将打印零行已被处理。因此,似乎在进程退出时,队列中已经有一个通知等待传递,并且传递是通过runMode:
调用发生的。
runMode:
现在,在工具退出后简单地调用一次似乎就足够了,但我的测试表明它不是 - 有时(有大量输出数据),这仍然只会处理部分剩余数据。
注意:诸如使调用的工具超出某些文本结尾标记之类的解决方法不是我寻求的解决方案。我相信必须有一些正确的方法来做到这一点,从而以某种方式发出管道流的结束信号,这就是我在答案中寻找的。
示例代码
下面的代码可以粘贴到新的 Xcode 项目AppDelegate.m
文件中。
运行时,它会调用一个生成更长输出的工具,然后使用waitUntilExit
. 如果它会立即删除outputFileHandleReadCompletionObserver
,则将丢失该工具的大部分输出。通过在runMode:
一秒钟内添加调用,工具的所有输出都会被接收 - 当然,这个定时循环不是最佳的。
而且我想保持runModal
函数同步,即它在接收到工具的所有输出之前不会返回。如果这很重要,它确实在我的实际程序中以自己的方式运行(我看到 Peter Hosey 的评论waitUntilExit
会阻止 UI,但在我的情况下这不是问题)。