http://www.network-theory.co.uk/docs/valgrind/valgrind_27.html
沃尔格里德信号模拟并不像可能那样强大。 提供了基本的PPOSIX符合要求的异构体和单质功能,但可以想象,如果你用信号对事情进行冷静,事情会变得非常令人不安。 工作:无。 不管怎么说,非第9条信号模棱两可的方案必然是不可分的,因此应尽可能避免。
因此,信号手里的print不是PPOSIX的信号过滤器,而阀门则有权打碎你的节目。
为什么print不是信号安全?
《glibc手册》指出:http://www.gnu.org/software/hello/manual/libc/Nonreentrancy.html“rel=“nofollow” http://www.gnu.org/software/hello/manual/libc/Nonreentrancy.html。
如果一项职能使用并修改了你提供的物品,则该功能有可能是不可抗拒的;如果使用同一物体,则有两条电话可以干预。
当你使用溪流时就会出现这种情况。 假设信号手印成纸张。 假设方案是在发出信号时使用同一流的印呼中进行的。 信号手电和节目数据都可能受到腐蚀,因为这两条电话都使用同样的数据结构,即上游本身。
然而,如果你知道,在信号能够到达时,该方案不可能使用手稿的流,那么你是安全的。 如果方案使用其他一些渠道,就没有问题了。
你们可以说,print* 不是在流中,而是在扼杀上。 但是,在内部,斜体的print的确在特殊流上发挥作用:
ftp://sources.redhat.com/pub/glibc/snapshots/glibc-latest.tar.bz2/glibc-20090518/libio/vsnprintf.c
int
_IO_vsnprintf (string, maxlen, format, args)
{
_IO_strnfile sf; // <<-- FILE*-like descriptor
<代码>%f,glibc的产出代码也在其内部有小型用户:
ftp://sources.redhat.com/pub/glibc/snapshots/glibc-latest.tar.bz2/glibc-20090518/stdio-common/fp.c
/* Allocate buffer for output. We need two more because while rounding
it is possible that we need two more characters in front of all the
other output. If the amount of memory we have to allocate is too
large use `malloc instead of `alloca . */
size_t wbuffer_to_alloc = (2 + (size_t) chars_needed) * sizeof (wchar_t);
buffer_malloced = ! __libc_use_alloca (chars_needed * 2 * sizeof (wchar_t));
if (__builtin_expect (buffer_malloced, 0))
{
wbuffer = (wchar_t *) malloc (wbuffer_to_alloc);
if (wbuffer == NULL)
/* Signal an error to the caller. */
return -1;
}
else
wbuffer = (wchar_t *) alloca (wbuffer_to_alloc);