当连接到终端时,stdout是行缓冲的,但我记得在某处读取(至少从stdin)将自动刷新stdout.我使用的所有C实现都已经完成了,但我现在无法在标准中找到它.
它确实有意义,它是这样的,否则代码如下:
printf("Type some input: ");
fgets(line, sizeof line, stdin);
Run Code Online (Sandbox Code Playgroud)
需要一个额外的 fflush(stdout);
那么stdout肯定会在这里刷新吗?
编辑:
正如几个回复所说,标准中似乎无法保证我的示例中的stdout输出将在从stdin读取之前出现,但另一方面,这个意图在(我的免费草稿副本)中说明了标准:
交互设备的输入和输出动态应按照7.19.3的规定进行.这些要求的目的是尽快出现无缓冲或行缓冲输出,以确保在程序等待输入之前实际出现提示消息.
(ISO/IEC 9899:TC2委员会草案 - 2005年5月6日,第14页).
所以似乎没有保证,但无论如何它可能适用于大多数实现.(著名遗言...)
我正在阅读本教程:http: //www.catonmat.net/blog/simple-haskell-tcp-server/ 了解Haskell网络模块的基础知识.他写了一个名为sockHandler的小函数:
sockHandler :: Socket -> IO ()
sockHandler sock = do
(handle, _, _) <- accept sock
hSetBuffering handle NoBuffering
forkIO $ commandProcessor handle
sockHandler sock
Run Code Online (Sandbox Code Playgroud)
接受连接,并将其分配给新线程.在打破代码的同时,他说:
"接下来我们使用hSetBuffering将客户端套接字句柄的缓冲模式更改为NoBuffering,因此我们没有缓冲惊喜."
但是没有详细说明这一点.他在谈论什么惊喜?我谷歌了,看到了一些安全文章(我猜测与被拦截的缓存有关),但似乎与本教程的内容没什么关系.
有什么问题?我想到了,但我认为我没有足够的网络经验来填补空白.
谢谢.
我在Haskell玩耍时发现了一些奇怪的东西.我在下面定义了一个简单的提示函数.
-- file: test.hs
main :: IO ()
main = putStrLn . ("Hello, " ++) =<< (putStr "Name: " >> getLine)
Run Code Online (Sandbox Code Playgroud)
当我runhaskell这样,它按预期工作,打印提示,等待我的输入,然后打印问候语.
$ runhaskell test.hs
Name: kwarrtz
Hello, kwarrtz
Run Code Online (Sandbox Code Playgroud)
然而,当我编译它时,事情变得奇怪.当我运行它时,它不会打印提示,而是给我一个空行并等待输入.当我输入我的名字并按Enter键时,它会在同一行打印提示和问候语.换句话说,getLine发生在之前putStr.
$ ghc test.hs
$ ./test
kwarrtz
Name: Hello, kwarrtz
Run Code Online (Sandbox Code Playgroud)
对发生了什么的任何想法?我想它与终端上的线路缓冲有关,但我不确定(我或者我在代码中犯了一些非常荒谬的错误).
我在Mac OS X El Capitan上运行GHC 7.8.3并使用默认的终端应用程序.