处理同步信号
Handling synchronous signals
我正在尝试查找与处理异步信号相比处理同步信号(SIGSEGV、SIGILL 等)的资源。
典型的信号处理机制(例如,使用 kill)在控制从内核模式转移到用户模式时调用信号处理程序。我的理解是 'synchronous' 信号更像是一个系统调用,控制权立即转移到内核——可能是因为同步信号通常与 CPU 中断(内存保护等)相关联,内核处理程序得到无论如何都会为这些调用。
在同步信号处理程序中使用 'async-signal-unsafe' libc 函数是否安全?例如,我看到 Linux mprotect(2) 手册页在 SIGSEGV 处理程序中使用了 printf。如何确定函数是否可以在这些情况下使用?
典型的类 Unix 内核对同步信号的处理与其对异步信号的处理有何不同?是什么让他们 'synchronous'?
我认为最好的资源之一是:
本质上没有同步和异步信号,但有些信号是异步传递的,有些信号可以同步或异步传递。
交付始终相同:如果设置,则调用用户模式下的信号处理程序。如果未设置,则使用默认行为(默认行为是终止进程,除了一些忽略或暂停的信号)。
如果信号是由某些外部原因发起的(例如其他人称为 kill
),则信号被认为是异步传递的。在这种情况下,从流程的角度来看,在发出和交付之间有时间:流程可以执行很多事情...
如果检测到应该发出信号的某些内部运行时原因,则会同步传送信号。例如,可以传递 SIGSEGV
或 SIGBUS
的错误内存访问、传递 SIGFPE
的被零除之类的浮点错误、错误指令 (SIGILL
) 等. 在这种情况下,当前执行的 code/instruction 是错误的来源,然后立即发出信号然后传递。在这种情况下,从流程的角度来看,发射和交付之间没有任何事情发生。
这里有两个部分。信号的产生和信号的接收。程序通过信号处理程序接收信号。就信号处理程序而言,信号的接收始终是异步的(即它无法预测何时接收)。
生成信号是同步的还是异步的是另一个问题。来自外部设备的中断显然是异步的。来自程序的发出信号的调用将阻塞该程序,直到调用 returns。在调用期间,信号可以异步发送(即它被放置在接收程序的队列中)或同步发送(即调用信号程序的处理程序并暂停信号 program/thread 直到处理程序 returns ,可能会返回一些值。)这方面的一个例子是 Windows SendMessage(同步)和 PostMessage(异步)
添加:"An interrupt from an external device is clearly asynchronous" 并挂起当前 运行 进程,直到处理程序完成 。因此,分段违规(硬件中断)会暂停当前 运行 进程(生成硬件信号)。它的默认处理方式是终止进程。
信号处理如前所述,评论是同步的和异步的。同步意味着 process/thread 正在执行某些指令并且此执行导致了中断。 forex int *a;printf("%d",*a); 可能导致分段错误。
异步:-客户端进程和服务器进程示例:-服务器正在关闭,它将向客户端发送信号到 stop.Here 客户端不会生成任何来自外部进程的中断。
每当有同步中断时,这意味着 process.Suggested 的问题是尽可能少地处理,没有库或复杂的 statement.Suppose 中断是由于 malloc 失败而不是再次使用某些库函数,这将再次因为 problem.Better 方法是在信号处理程序本身中进行自动进程重启。
我正在尝试查找与处理异步信号相比处理同步信号(SIGSEGV、SIGILL 等)的资源。
典型的信号处理机制(例如,使用 kill)在控制从内核模式转移到用户模式时调用信号处理程序。我的理解是 'synchronous' 信号更像是一个系统调用,控制权立即转移到内核——可能是因为同步信号通常与 CPU 中断(内存保护等)相关联,内核处理程序得到无论如何都会为这些调用。
在同步信号处理程序中使用 'async-signal-unsafe' libc 函数是否安全?例如,我看到 Linux mprotect(2) 手册页在 SIGSEGV 处理程序中使用了 printf。如何确定函数是否可以在这些情况下使用?
典型的类 Unix 内核对同步信号的处理与其对异步信号的处理有何不同?是什么让他们 'synchronous'?
我认为最好的资源之一是:
本质上没有同步和异步信号,但有些信号是异步传递的,有些信号可以同步或异步传递。
交付始终相同:如果设置,则调用用户模式下的信号处理程序。如果未设置,则使用默认行为(默认行为是终止进程,除了一些忽略或暂停的信号)。
如果信号是由某些外部原因发起的(例如其他人称为 kill
),则信号被认为是异步传递的。在这种情况下,从流程的角度来看,在发出和交付之间有时间:流程可以执行很多事情...
如果检测到应该发出信号的某些内部运行时原因,则会同步传送信号。例如,可以传递 SIGSEGV
或 SIGBUS
的错误内存访问、传递 SIGFPE
的被零除之类的浮点错误、错误指令 (SIGILL
) 等. 在这种情况下,当前执行的 code/instruction 是错误的来源,然后立即发出信号然后传递。在这种情况下,从流程的角度来看,发射和交付之间没有任何事情发生。
这里有两个部分。信号的产生和信号的接收。程序通过信号处理程序接收信号。就信号处理程序而言,信号的接收始终是异步的(即它无法预测何时接收)。
生成信号是同步的还是异步的是另一个问题。来自外部设备的中断显然是异步的。来自程序的发出信号的调用将阻塞该程序,直到调用 returns。在调用期间,信号可以异步发送(即它被放置在接收程序的队列中)或同步发送(即调用信号程序的处理程序并暂停信号 program/thread 直到处理程序 returns ,可能会返回一些值。)这方面的一个例子是 Windows SendMessage(同步)和 PostMessage(异步)
添加:"An interrupt from an external device is clearly asynchronous" 并挂起当前 运行 进程,直到处理程序完成 。因此,分段违规(硬件中断)会暂停当前 运行 进程(生成硬件信号)。它的默认处理方式是终止进程。
信号处理如前所述,评论是同步的和异步的。同步意味着 process/thread 正在执行某些指令并且此执行导致了中断。 forex int *a;printf("%d",*a); 可能导致分段错误。 异步:-客户端进程和服务器进程示例:-服务器正在关闭,它将向客户端发送信号到 stop.Here 客户端不会生成任何来自外部进程的中断。 每当有同步中断时,这意味着 process.Suggested 的问题是尽可能少地处理,没有库或复杂的 statement.Suppose 中断是由于 malloc 失败而不是再次使用某些库函数,这将再次因为 problem.Better 方法是在信号处理程序本身中进行自动进程重启。