在Linux中,当程序(可能有多个线程)收到SIGTERM或SIGHUP等信号时会发生什么?
哪个线程截获信号?多个线程可以获得相同的信号吗?是否有专门用于处理信号的特殊线程?如果没有,那么处理信号的线程内部会发生什么?信号处理程序例程结束后如何恢复执行?
我的理解是,一般来说,如果从信号处理程序调用非异步信号安全函数,行为是不确定的,但我听说linux允许你安全地调用任何系统调用.这是真的?此外,SIGSEGV处理程序的唯一可移植行为是中止或退出,但我知道如果你返回,linux实际上会恢复执行,是吗?
我在Linux中有一个多线程的程序.有一些记忆区域,我有兴趣看看它们是否在一定时间内写完.为此,我只给予那些内存页面的读访问权限,并为SIGSEGV安装信号处理程序.现在我的问题是,每个线程是否会为自己调用信号处理程序.假设线程1写入一些禁止的内存区域,它会执行信号处理程序吗?
如何限制单个Linux进程的内存使用,而不是终止该进程。
我知道ulimit可以限制内存使用,但是如果超过限制,将终止该进程。
是否有任何其他命令或外壳程序可以限制内存使用并且不会终止进程?
我知道SIGSEGV当内核使用它报告内存访问冲突时不能忽略这一点。但是,如果我安装一个SIGSEGV不执行任何操作的信号处理程序,然后另一个进程使用kill该信号向我发送该信号,那么其行为是否与我使用“正常”信号(如 )相同SIGUSR1?
我想了解信号处理的工作原理,因此我决定以另一种方式处理除以零。程序应请求输入,直到不发生被零除为止。但是,我的处理程序在第一次跳转后被忽略,并且除法由系统处理。为什么会出现这种情况?
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
jmp_buf env;
void handler(int sig) {
printf("Invalid input , try again\n");
longjmp(env , 1);
}
int main() {
signal(SIGFPE , handler);
int x , y;
setjmp(env);
scanf("%d%d" , &x , &y);
printf("%d\n" , x / y);
}
Run Code Online (Sandbox Code Playgroud)