我使用NSTimer
每秒尝试输出到STDOUT。
我编写了以下代码并将其保存为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
?
请教我。
答案 0 :(得分:3)
这是"正常" stdio库的行为。文件描述符
可以"缓冲",这意味着所有printf()
和...的结果
其他输出操作首先进入内部缓冲区。当那个
缓冲区达到一定的大小(例如8KB),其内容写入实际
文件。
有三种模式:"无缓冲" (所有输出都写入文件 立即),"线缓冲" (收集输出直到换行 字符被打印), 和#34;完全缓冲"。
根据Is stdout line buffered, unbuffered or indeterminate by default?:
Unix惯例是stdin和stdout在与终端关联时是行缓冲的,否则是完全缓冲的(也就是块缓冲的)。
这解释了为什么您会看到每个打印操作的输出 当输出到达终端时立即,但不是在何时 输出重定向到文件。
用
print("buz")
fflush(stdout)
您可以强制将输出立即写入文件。 或者,您可以将标准输出设置为线缓冲模式 通过调用
setlinebuf(stdout)
在打印任何内容之前。