0

我正在尝试学习有关重入呼叫的知识,并且正在尝试使用_vsnprintf_r(). 第一个参数似乎是 some struct _reent *。在 Cygwin 上,似乎我可以像这样使用它:_vsnprintf_r (_REENT, /* rest of the arguments here */). 这个对吗?即使在 Cygwin 之外,这是否正确?似乎确实缺乏这方面的文档。我的 Google 和 Bing 搜索结果并不理想。

4

2 回答 2

2

_vsnprintf_r不是标准功能。它由 cygwin 开发团队创建供内部使用。

_vsnprintf_r常规调用vsnprintf,因此我会坚持C在 cygwin 上使用此调用的常规版本。cygwin 不保证_vsnprintf_r无论如何它是可重入的,特别是如果您找不到任何有关它的文档。

由于 cygwin 使用动态加载的库,该库在与其链接的所有进程之间共享状态,因此它使用_<xxx>_r调用的版本为每个进程提供其自己的状态实例,这通常是标准 UNIX 系统上的默认值。由于 cygwin 内部使用了这些函数,您可能会发现cygwin-developers 邮件列表是解决您问题的更好资源。

这与 POSIX 定义的可重入函数(如gmtime_r)形成对比。这些返回指向库中静态内存的指针的不可重入版本,因此创建了可重入版本以允许函数使用调用者传入的内存。

于 2012-06-15T14:23:14.527 回答
-1

您可能不想通过重入调用“打印”任何内容,因为您不知道什么顺序或什么时候会“打印”。

一般来说,要编写可重入函数,请将所有内容传递给函数(无静态变量)。本地(堆栈)变量没问题 AFAIK。

打印是信号量(或其他一些锁定机制)的“经典”问题。否则,

你好世界

变成

赫洛洛德

或者充其量

地狱世界

于 2012-06-15T14:45:53.527 回答