为什么setbuf与open_memstream文件崩溃?

时间:2017-07-20 00:58:49

标签: posix stdio

我正在使用c11标准中提到的“新”stdio函数:open_memstreamfmemopen

使用gcc编译Ubuntu 16.10或使用clang编译Rextester(参见下面的链接)

size_t sizeloc = 0; char *bufloc = NULL;
FILE *mf = open_memstream (&bufloc, &sizeloc);
setbuf(mf, NULL);  // this crashes

在使用 open_memstream 创建的文件上为无缓冲模式调用setbuf会抛出sigsegv。 (我想设置无缓冲模式,而不是在每次写入后调用fflush。顺便说一下,fflush工作。)

为什么setbuf(mf,NULL)崩溃了?我做错了什么?

在另一个函数 fmemopen 返回的文件上,setbuf(mf, NULL)正常工作,似乎做了预期的事情。

link to my example @rextester

1 个答案:

答案 0 :(得分:1)

严格地说,POSIX目前不支持您尝试做的事情。这也是不必要的,因为FROM myapp_officialimage ENV CUSTOM_PLUGIN_LIST="plugin_1 plugin_3 plugin_7 plugin_8" for plugin in $CUSTOM_PLUGIN_LIST; \ do \ COPY plugins/$plugin/* /usr/lib/myapp/plugins/ \ RUN myapp-plugins.sh enable $plugin \ done CMD ["myapp-start.sh"] 的规范基本上表示没有缓冲(至少我认为这是意图)。

似乎将open_memstreamopen_memstream添加到POSIX而不考虑与现有接口的交互。 fmemopen的说明已从C标准中复制而未更新,并说:

  

setvbuf()函数可以在 stream 指向的流与打开的文件相关联之后但在任何其他操作之前使用[...]

这意味着不允许对新流使用此函数,因为没有关联的文件。但我认为这确实是一个意外,与setvbufopen_memstream的互动完全被忽略了。同样的事情发生在实现方面,也没有考虑这个用例,所以glibc崩溃了。

同样,不清楚fmemopen是否应该对没有文件支持的流产生影响。

相关问题