我正在使用c11标准中提到的“新”stdio函数:open_memstream
和fmemopen
。
使用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)
正常工作,似乎做了预期的事情。
答案 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_memstream
和open_memstream
添加到POSIX而不考虑与现有接口的交互。 fmemopen
的说明已从C标准中复制而未更新,并说:
setvbuf()函数可以在 stream 指向的流与打开的文件相关联之后但在任何其他操作之前使用[...]
这意味着不允许对新流使用此函数,因为没有关联的文件。但我认为这确实是一个意外,与setvbuf
和open_memstream
的互动完全被忽略了。同样的事情发生在实现方面,也没有考虑这个用例,所以glibc崩溃了。
同样,不清楚fmemopen
是否应该对没有文件支持的流产生影响。