我正在编写的代码有很多调用来创建新的字符串之类的东西。但最近在将服务器升级到12.10 Ubuntu后,我开始遇到一些麻烦。一些子进程会卡在futex中。因此,我将GDB附加到在futex中运行了很长一段时间的进程,我执行了一个backtrace,并找到了以下日志
#0 0x00007f563afc69bb in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007f563af4a221 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#2 0x00007f563af47fa7 in mal
我想确切地知道异步信号处理程序在Linux上是如何执行的。首先,我不清楚哪个线程执行信号处理程序。其次,我想知道让线程执行信号处理程序所遵循的步骤。
关于第一个问题,我读到了两种不同的、似乎相互矛盾的解释:
The Linux Kernel,作者: Andries Brouwer,:
当信号到达时,进程中断,保存当前寄存器,并调用信号处理程序。当信号处理程序返回时,中断的活动将继续。
让我认为Linux的行为是:
当一个信号被传递到一个进程时,如果它被捕获了,它将由一个且只有一个满足以下条件的线程来处理:
1. A thread blocked in a [**sigwait**(2)](h
每一个人,当我使用fork和signal做一些实验时,我遇到了一个程序,它显示了非常有趣的行为,但经过几个小时的努力,我无法弄清楚发生了什么。
我尝试做的是在主体中创建子进程,然后打印"hello world“,然后调用exit。在此之后,完全可以理解,它的信号处理程序将被调用,被等待系统调用阻塞的父进程也将被调用。现在,我在信号处理程序中创建了另一个进程,但从那时起,输出将变为无穷大。
输出是这样的: Hello world to Linux to UNIX ...
还有为什么Linux一次又一次地打印出来。
另外,当fork被调用时,请告诉我,我知道重复的地址空间是由父对象构成的,