glibc sprintf 可以用在可重入函数中吗?

问题描述 投票:0回答:4

如果 sprintf 写入本地缓冲区,我可以在可重入函数中使用它吗?像这样的东西:

void reentrant_function () { 
    int i = 4;
    char buffer[20];
    snprintf(buffer, 20, "%d", i); 
}
c++ c linux glibc reentrancy
4个回答
4
投票

我访问此页面是因为我也在问同样的问题。这是我从书上读到的:

UNIX 环境中的高级编程:第二版

第 10.6 节

图 10.4 中没有的大多数函数(可重入函数列表) 都缺失,因为 (a) 它们已知使用静态数据结构,(b) 它们调用 malloc 或 free,或者 (c) 它们是标准 I/O 库

Linux 编程接口

第 21.1.2 章

如果函数使用静态数据结构,那么它们也可以是不可重入的 内部簿记。此类函数最明显的例子是成员 stdio 库(printf()、scanf() 等),用于更新内部数据 缓冲 I/O 的结构。

我想这取决于实施。这还取决于您实际如何使用 snprintf(缓冲区是必不可少的)。这个问题最安全的答案应该是“不”。


2
投票

当然可以,除非您的

buffer
static


2
投票

是的。

为什么你认为你不能?没有全球性的。

想到一件事:缓冲区是函数的本地缓冲区,为什么要格式化字符串而不对其执行任何操作?


0
投票

手册页说它是“MT安全区域设置”,这意味着“在其他线程存在的情况下调用是安全的”,除了它从区域设置对象中读取而没有任何形式的同步,因此不安全与任何区域设置更改同时调用。

© www.soinside.com 2019 - 2024. All rights reserved.