以下是用于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
的使用是一个坏主意,但是如果没有一种主动的等待或手动管理一些执行线程,该怎么办呢?
答案 0 :(得分:2)
您可以尝试刷新标准输出:
fflush(__stdoutp)
或将stdout上的缓冲区大小设置为零(使其更快,但使用更多的资源):
setbuf(__stdoutp, nil)
请参见Swift: how to flush stdout after println?
这是通常的解决方案,当您看到输出到终端时,但将进程通过管道传送到另一个进程(如grep)后却没有输出。管道会影响默认的缓冲选择。希望这会有所帮助!