我尝试每秒输出到 STDOUT 通过使用NSTimer
.
我编写了以下代码并将其保存为sample.swift。
#!/usr/bin/swift
import AppKit
class Foo : NSObject {
override init() {
super.init()
NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "bar", userInfo: nil, repeats: true)
}
func bar() {
print("buz")
}
}
let h = Foo()
// Output successful
// while true {
// print("Foo!")
// }
NSRunLoop.mainRunLoop().run()
然后,我执行了以下命令,可以看到buz
.
okada@iyokan$ ./sample.swift
buz
buz
buz
buz
所以,我执行了以下命令,但我看不到任何buz
.
okada@iyokan$ ./sample.swift > sample.log # wait 5 seconds
okada@iyokan$ cat sample.log
okada@iyokan$
顺便说一句,我尝试了 while 循环版本(激活注释掉上面的代码)然后我可以得到buz
通过两个程序。
为什么我无法得到任何buz
?
请教我。
这是 stdio 库的“正常”行为。文件描述符
可以“缓冲”,这意味着所有的结果printf()
和
其他输出操作首先进入内部缓冲区。当那个
缓冲区达到一定大小(例如8KB),其内容被写入实际
文件。
共有三种模式: “无缓冲”(所有输出都写入文件
立即),“行缓冲”(收集输出,直到出现换行符
字符被打印),
和“完全缓冲”。
根据默认情况下,stdout 行是缓冲的、无缓冲的还是不确定的?:
Unix 约定是 stdin 和 stdout 在与终端关联时是行缓冲的,否则是完全缓冲的(也称为块缓冲)。
这解释了为什么您会看到每个打印操作的输出
当输出到达终端时立即,但不是当
输出被重定向到文件。
With
print("buz")
fflush(stdout)
您可以强制将输出立即写入文件。
或者,您可以将标准输出设置为行缓冲模式
通过致电
setlinebuf(stdout)
在打印任何内容之前。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)