我正在尝试了解有关重入调用的内容,我正在尝试使用_vsnprintf_r()
。第一个参数似乎是一些struct _reent *
。在Cygwin上,似乎我可以像这样使用它:_vsnprintf_r (_REENT, /* rest of the arguments here */)
。它是否正确?即使在Cygwin之外,这是否正确?似乎缺乏这方面的文件。我的Google和Bing搜索效果不佳。
答案 0 :(得分:2)
_vsnprintf_r
不是标准函数。它由cygwin开发团队创建,供内部使用。
常规_vsnprintf_r
会调用vsnprintf
,因此我会坚持在cygwin上使用此调用的常规C
版本。 cygwin无法保证_vsnprintf_r
无论如何都是可重入的,特别是如果你找不到任何关于它的文档。
由于cygwin使用动态加载的库,该库在链接它的所有进程之间具有共享状态,因此它使用_<xxx>_r
版本的调用为每个进程提供自己的状态实例,这些实例通常是默认的标准的UNIX系统。由于cygwin在内部使用这些函数,您可能会发现cygwin-developers mailing list更适合您的问题。
这与POSIX定义的可重入函数(如gmtime_r
)形成对比。这些返回指针的非重入版本指向库中的静态内存,因此创建了可重入版本,以允许函数使用调用者传入的内存。
答案 1 :(得分:-1)
您可能不希望通过重入电话“打印”任何内容,因为您不知道什么顺序或什么时候会“打印”。
一般而言,要编写可重入函数,将所有内容传递给函数(无静态变量)。本地(堆栈)变量是好的AFAIK。
打印是信号量(或其他一些锁定机制)的“经典”问题。否则,
您好 世界
变为
HeWlorllod
或充其量
HellWorldo