首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我不应该使用stdbuf的完全缓冲模式吗?

我不应该使用stdbuf的完全缓冲模式吗?
EN

Unix & Linux用户
提问于 2018-12-09 17:37:27
回答 1查看 176关注 0票数 3

在我的系统(最近更新的Arch )中,stdbuf的手册在"BUGS“部分中有如下内容:

在GLIBC平台上,指定缓冲区大小(即使用完全缓冲模式)将导致未定义的操作。

除了有点好奇为什么会出现这种情况,以及“未定义的操作”意味着什么之外,我最担心的是,这是否意味着我永远不应该为命令指定缓冲区大小,如果这样做,它是否会在我的脸上爆炸。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 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选项提供什么参数,似乎都能很好地处理它们。示例:

代码语言:javascript
运行
复制
$ 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
票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/486960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档