C 是可重入的吗?
是C 是可重入的吗?,c,signals,reentrancy,C,Signals,Reentrancy,是int put(const char*)重新进入者?我可以安全地将其放入信号处理程序吗?是一个表,其中包含所有被认为对信号处理安全的函数: “下表定义了一组 功能应为 可重入或不可中断的 信号和应 异步信号安全。” puts似乎不在该列表中,但是根据,它被视为可重入的,但不是异步安全的,这可能是它不在上述列表中的原因。不,它不是,但是您可以使用异步信号安全的write(),从信号处理程序输出消息: #include <unistd.h> const char* msg = "Th
int put(const char*)代码>重新进入者?我可以安全地将其放入信号处理程序吗?是一个表,其中包含所有被认为对信号处理安全的函数:
“下表定义了一组
功能应为
可重入或不可中断的
信号和应
异步信号安全。”
puts
似乎不在该列表中,但是根据,它被视为可重入的,但不是异步安全的,这可能是它不在上述列表中的原因。不,它不是,但是您可以使用异步信号安全的write()
,从信号处理程序输出消息:
#include <unistd.h>
const char* msg = "The message to print.";
write(STDOUT_FILENO, msg, strlen(msg));
#包括
const char*msg=“要打印的消息。”;
写入(STDOUT_文件号、msg、strlen(msg));
Hmm,put
和write
之间的区别在哪里?@让我说:不确定,但是put()
是stdio的一部分,它本身不是异步信号安全的。可能,但不限于输出缓冲等功能。@Christian是的,你是对的,我完全忘记了整个stdio是在文件
结构而不是文件描述符之上工作的。问题是内存缓冲put()
可能需要一个缓冲区,这可能需要分配一个新的缓冲区,这可能需要调用sbrk()
或mmap()
来分配内存。这两个函数不是异步信号安全的。(不过,stdout FD的实际底层write()
很好。)strlen()
本身是异步信号安全的吗。“下表定义了一组异步信号安全的函数。因此,应用程序可以不受限制地从信号捕获函数调用它们。”。。。后来。。。“斯特伦”。谢谢你的信息!