面试题答案
一键面试可重入性概念
在Linux环境下,C语言信号处理函数的可重入性指该函数能够被中断,且在被中断后再次调用时,能正常执行而不会出现数据错误或其他异常情况。也就是说,当信号处理函数在执行过程中被另一个信号中断,再次进入该信号处理函数时,其内部状态和执行结果是可预期的,不会因为多次调用导致函数内部数据混乱。这要求函数不依赖于静态或全局变量的特定状态,不调用不可重入的函数,并且自身的执行逻辑不受中断的影响。
可能导致不可重入的函数例子及原因
例如 printf
函数。原因是 printf
函数通常会使用静态数据结构来管理输出缓冲区等资源。当一个信号处理函数调用 printf
进行输出时,如果在 printf
尚未完成其内部操作(如向缓冲区写入数据、刷新缓冲区等)时,另一个信号中断了当前信号处理函数,再次调用 printf
,就可能会导致缓冲区数据混乱,因为两个 printf
调用可能会同时操作同一个静态缓冲区,从而破坏数据的一致性,所以 printf
是不可重入函数。