当前位置: 首页 > 面试题库 >

Linux是否允许从信号处理程序进行任何系统调用?

程钧
2023-03-14
问题内容

我的理解是,通常来说,如果您从信号处理程序调用非异步信号安全函数,则行为是不确定的,但是我听说linux允许您安全地调用任何系统调用。这是真的?另外,SIGSEGV处理程序的唯一可移植行为是中止或退出,但是我知道如果您返回,Linux实际上将恢复执行,是吗?


问题答案:

我相信可以从信号处理程序中调用任何实际的系统调用。真实的系统调用中的数字为<asm/unistd.h>(或<asm/unistd_64.h>)。

手册页第2节中的某些posix函数是通过“多路复用”系统调用实现的,因此,就我而言,它们不是“真正的系统调用”

从应用程序的角度来看,系统调用是原子操作。它几乎就像一条机器指令(来自应用程序内部)。

如果您的问题是: 处理程序 可以SIGSEGV通过mprotect或更改错误的地址映射mmap?_那么我相信答案是 _肯定的(至少在X86-64和X86-32架构),因为在这里说你引用了一个问题,但我没有尝试。我已经读到,这样做效率很低(SIGSEGV处理不是很快,mprotect或者mmap也有点慢)。特别是,以这种方式模仿Hurd/Mach外部寻呼机可能效率很低。



 类似资料:
  • 我正在寻找“对象或函数不允许在信号处理程序”的定义。在SEC里用的。N3797的3.6.3/4: 总的来说,我想为这个UB规则找到一个例子。

  • 我正在开发一个用PHP编写的预分叉TCP套接字服务器。 守护进程(父进程)分叉一定数量的子进程,然后等待,直到它被告知退出并且子进程都走了或者它收到信号。 SIGINT和SIGTERM使其将SIGTERM发送给所有子级。 孩子们建立了他们自己的信号处理器:SIGTERM导致一个干净的退出。SIGUSR1导致它转储一些状态信息(只需在下面的示例代码中打印出它收到了信号)。 如果子异常退出,则父级启动

  • #include <stdio.h> #include <signal.h> void handler(int sig); void handler(int sig) { signal(sig, handler); printf("Receive signal: %d\n", sig); } int main(void) { signal(SI

  • 我的项目在android系统中使用了一个捕获崩溃并发送的模块。当处理本机崩溃时,本机代码会做一些事情,然后从JNI进行java调用。它在Dalvik上运行良好。但在使用ART的android以上版本中就失效了,因为ART在原生信号处理过程中阻止了任何来自JNI的Java调用。上面说ART信号处理使用交替信号栈,所以在信号处理过程中,不能调用java方法?还有其他方法吗??< br >流量:< br

  • 我最近看到了以下帖子: 内存分配器的级别不低于malloc。(默认分配器通常直接或间接调用malloc) 分配器只允许您指定不同的分配策略。例如,您可以使用一个分配器,它调用malloc一次来检索一个大内存池,然后对于后续的分配请求,它只返回这个内存池的一小部分。 或者,您可以将其用作钩子,允许您在每次分配或释放内存时执行一些额外的任务。 关于你的第二个问题,malloc是您可以在不失去可移植性的

  • 问题内容: 我有两个共享库链接到我的测试应用程序。这两个库都具有的信号处理程序。 同一信号具有多个信号处理程序是否有效?生成信号时,处理程序将执行哪个顺序? 问题答案: 正如其他人所说,只能设置一个信号处理程序,这是最后一个。然后,您将不得不自己管理调用两个函数。该函数可以返回以前安装的信号处理程序,您可以自己调用该信号处理程序。 这样的东西(未经测试的代码):