在我的系统(最近更新的Arch )中,stdbuf
的手册在"BUGS“部分中有如下内容:
在GLIBC平台上,指定缓冲区大小(即使用完全缓冲模式)将导致未定义的操作。
除了有点好奇为什么会出现这种情况,以及“未定义的操作”意味着什么之外,我最担心的是,这是否意味着我永远不应该为命令指定缓冲区大小,如果这样做,它是否会在我的脸上爆炸。
发布于 2018-12-11 03:02:24
看起来,这只是stdbuf
之前版本的遗留,不再符合现实。
在一个来自评论的stdbuf
's源代码中,它说:
/*注释当前对于glibc (2.3.5),以下调用不会更改缓冲区大小,而且更多的问题没有给出新的大小请求被忽略的任何指示: setvbuf (stdout,(char*)NULL,_IOFBF,8192);
但是实际的代码还在继续(不情愿地?)分配缓冲区本身,而不是依赖C库来完成它,完全绕过了这种有问题的行为。
if (size > 0) { if (!(buf = malloc (size))) /\* will be freed by fclose() \*/
而且(从同样的评论中)似乎不再是这样了:
Another issue is that on glibc-2.7 the following doesn't buffer the first write if it's greater than 1 byte. setvbuf(stdout,buf,\_IOFBF,127);
无论我向-i
和-o
选项提供什么参数,似乎都能很好地处理它们。示例:
$ echo 'int main(){ int c; while((c=getchar()) != EOF) putchar(c); }' | cc -include stdio.h -x c - -o slowcat
$ strace -s5 -e trace=read,write stdbuf -i143 -o127 2>&1 ./slowcat /dev/null | awk '/ELF/{next}1;++n>5{exit}'
read(0, "\0\0\0\0\0"..., 143) = 143
write(1, "\0\0\0\0\0"..., 127) = 127
read(0, "\0\0\0\0\0"..., 143) = 143
write(1, "\0\0\0\0\0"..., 127) = 127
read(0, "\0\0\0\0\0"..., 143) = 143
write(1, "\0\0\0\0\0"..., 127) = 127
https://unix.stackexchange.com/questions/486960
复制相似问题