如何grep使用RunLoop的macOS控制台应用程序的标准输出

时间:2018-09-08 07:30:45

标签: swift macos grep console-application nsrunloop

以下是用于macOS控制台应用程序的简单Swift代码:

import Foundation

print("hello world")
RunLoop.main.run()

在我的真实代码中,我使用RunLoop来避免退出控制台应用程序,因为我对某些CoreBluetooth事件做出了反应,并且有无限循环要显示的事物。我只想使用Ctrl + C退出该应用。

但是,当使用RunLoop.main.run()时,我无法再在终端中重复输出:

$ ./app
hello world
^C
$ ./app | grep hello
^C

关于如何grep输出的一些想法? 我猜想RunLoop的使用是一个坏主意,但是如果没有一种主动的等待或手动管理一些执行线程,该怎么办呢?

1 个答案:

答案 0 :(得分:2)

您可以尝试刷新标准输出:

fflush(__stdoutp)

或将stdout上的缓冲区大小设置为零(使其更快,但使用更多的资源):

setbuf(__stdoutp, nil)

请参见Swift: how to flush stdout after println?

这是通常的解决方案,当您看到输出到终端时,但将进程通过管道传送到另一个进程(如grep)后却没有输出。管道会影响默认的缓冲选择。希望这会有所帮助!