Articles of 缓冲

带有setuid /function的stdbuf

我正在从另一个生成输出的进程(慢和无限)读取输出。 因为我想实时读取这些数据,我使用“stdbuf -oL”(行缓冲,数据是文本)。 我没有控制生成过程,所以我不能修改源来强制刷新。 到目前为止,stdbuf工作得很好,但是该进程使用SOCK_RAW,并且需要以root身份运行,具有setuid(0)或cap_net_rawfunction。 以非root用户身份运行setuid或functionstdbuf似乎被忽略。 让我来certificate这个问题: 这是一个简单的作家: #include <stdio.h> #include <unistd.h> int main(){ int i; for ( i = 0;; i++){ fprintf(stdout, "%d\n", i); sleep(1); } } 还有一个简单的读者: #include <stdio.h> int main(){ char* line = NULL; size_t n = 0; while (getline(&line, &n, stdin) != -1 ) { fputs(line, stdout); } } 正如所料,通过执行./writer | […]

禁用stdout和stderr缓冲是否安全?

有时我们用这种方法在代码中放置一些debugging打印件 printf("successfully reached at debug-point 1\n"); some code is here printf("successfully reached at debug-point 2"); Here segmantaion fault occur due to some reason 现在在这种情况下,只有debug-point1将打印在stdiodebugging点2打印被写入stdio缓冲区,但它不刷新,因为它没有得到\n所以我们认为崩溃发生在debugging点1 如果我用这种方式禁用stdio和stderrstream的缓冲选项,从这里来 setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); 那么这是安全的做到这一点? 为什么所有的stream都默认行缓冲? 编辑: Usualy对于任何文件stream,默认分配的缓冲区的大小是多less? 我认为它的OS依赖。 我想知道关于Linux?

为什么fprintf不直接写入文件,除非使用fflush()?

我写了一个守护进程,在文件中写入一个值。 我所观察到的是,当我一直写在一个文件上,文件中没有任何可见的东西。 另一方面,如果我使用fflush()方法,则字符在文件中可见。 为什么fflush()有所作为?

closures缓冲

下面的缓冲区在哪里?我怎么把它关掉? 我正在写一个Python程序的标准输出,如下所示: for line in sys.stdin: print line 这里有一些缓冲: tail -f data.txt | grep -e APL | python -u Interpret.py 我尝试了以下来摆脱可能的缓冲……没有运气: 如上所述使用-u标志和python调用 在每个sys.stdout.write()调用之后调用sys.stdout.flush()…所有这些创build一个缓冲的stream与Python等待的东西像一分钟打印出头几行。 使用了以下修改的命令: stdbuf -o0 tail -f data.txt | stdbuf -o0 -i0 grep -e APL | stdbuf -i0 -o0 python -u Interpret.py 以我的期望为基准,我尝试了: tail -f data.txt | grep -e APL 这产生了稳定的stream水线…它肯定不像python命令那样缓冲。 那么,如何closures缓冲? 解答:事实certificate,pipe道两端都有缓冲。

小读取(重叠,缓冲)的解释优于大的连续读取?

(道歉有点冗长介绍) 在开发一个将整个大文件(> 400MB)预先默认为缓冲区caching以加快实际运行速度的应用程序的开发过程中,我testing了一次读取4MB是否比一次只读取1MB块有什么明显的好处。 令人惊讶的是,较小的请求实际上变得更快。 这似乎是反直觉的,所以我进行了更广泛的testing。 缓冲区caching在运行testing之前已被清除(只是为了笑,我也是在缓冲区中运行了一个文件)缓冲区caching提供了2GB / s以上的速度,无论请求大小如何,虽然有惊人的+/- 30%随机方差)。 所有使用重叠的ReadFile与相同的目标缓冲区(使用FILE_FLAG_OVERLAPPED 而不使用FILE_FLAG_OVERLAPPED打开句柄)。 使用的硬盘有点年迈但function齐全,NTFS的簇大小为8kB。 磁盘在初始运行后进行了碎片整理(6个碎片与未碎片,零差异)。 为了更好的数字,我也使用了一个更大的文件,下面的数字是阅读1GB。 结果真是令人惊讶: 4MB x 256 : 5ms per request, completion 25.8s @ ~40 MB/s 1MB x 1024 : 11.7ms per request, completion 23.3s @ ~43 MB/s 32kB x 32768 : 12.6ms per request, completion 15.5s @ ~66 MB/s 16kB x 65536 : […]

Haskell:立即从控制台读取input字符,而不是在换行符之后

我试过这个: main = do hSetBuffering stdin NoBuffering c <- getChar 但是等到input被按下,这不是我想要的。 我想在用户按下后立即读取字符。 我在Windows 7上使用ghc v6.12.1。 编辑:我的解决方法是从GHC移动到WinHugs,正确支持这一点。