Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是可重入的吗?_C_Signals_Reentrancy - Fatal编程技术网

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()
本身是异步信号安全的吗。“下表定义了一组异步信号安全的函数。因此,应用程序可以不受限制地从信号捕获函数调用它们。”。。。后来。。。“斯特伦”。谢谢你的信息!