在Linux和Windows下实现信号?

我对编程中使用信号并不陌生。 我主要工作在C / C ++和Python。 但是我有兴趣知道如何在Linux(或Windows)中实际实现信号。

在信号描述符表中的每个CPU指令之后,如果有任何注册信号被处理,操作系统是否会检查? 或者是负责这个的stream程pipe理器/调度器?

由于信号是asynchronous的,CPU指令在完成之前是否中断呢?

Solutions Collecting From Web of "在Linux和Windows下实现信号?"

操作系统绝对不会处理每一条指令。 没门。 太慢了。

当CPU遇到一个问题时(比如被0除法,访问一个受限资源或者一个没有被物理内存备份的内存位置),它会产生一种特殊的中断,称为异常(不要和C ++ / Java混淆/ etc高级语言异常摘要)。

操作系统处理这些异常。 如果需要的话,如果可能的话,它可以反映一个例外,回到它起源的过程。 Windows中所谓的结构化异常处理 (SEH)就是这种反映。 C信号应该使用相同的机制来实现。

在我所熟悉的系统上(尽管我不明白为什么它应该和别的地方有很大不同),当进程从内核返回到用户模式时,信号传递就完成了。

先考虑一个cpu的情况吧。 有三种信号源:

  • 该进程发送一个信号给自己
  • 另一个进程发送信号
  • 一个中断处理程序(网络,磁盘,USB等)导致一个信号被发送

在所有这些情况下,目标进程不在用户空间运行,而是在内核模式下运行。 无论是通过系统调用,还是通过上下文切换(由于其他进程无法发送信号,除非我们的目标进程没有运行),或通过中断处理程序。 所以信号传递只是一个简单的问题,在从内核模式返回到userland之前,是否有任何信号要传递。

在多CP​​U情况下,如果目标进程在另一个CPU上运行,那么只需要向正在运行的CPU发送一个中断。 中断除了强制其他CPU进入内核模式并返回,以便信号处理可以在返回之前完成。

一个进程可以发送信号到另一个进程。 进程可以注册自己的信号处理程序来处理信号。 SIGKILL和SIGSTOP是无法捕获的两个信号。

当进程执行信号处理程序时,它会阻塞相同的信号,也就是说,当信号处理程序正在执行时,如果有另一个相同的信号到达,它将不会调用信号处理程序[称为阻塞信号],但是它使得信号已经到达[即:待处理信号]。 一旦已经运行的信号处理程序被执行,则待处理的信号被处理。 如果你不想运行待处理的信号,那么你可以忽略这个信号。

上述概念中的问题是:

假设如下:进程A已经为SIGUSR1注册了信号处理程序。

1) process A gets signal SIGUSR1, and executes signalhandler() 2) process A gets SIGUSR1, 3) process A gets SIGUSR1, 4) process A gets SIGUSR1, 

当步骤(2)发生时,它被作为“未决信号”。 即; 它需要被服务。 并且当步骤(3)发生时,它被忽略,因为只有一个比特可用于指示每个可用信号的未决信号。

为了避免这样的问题,即:如果我们不想丢失信号,那么我们可以使用实时信号。

2)信号同步执行,

例如。,

  1) process is executing in the middle of signal handler for SIGUSR1, 2) Now, it gets another signal SIGUSR2, 3) It stops the SIGUSR1, and continues with SIGUSR2, and once it is done with SIGUSR2, then it continues with SIGUSR1. 

3)恕我直言,我记得检查是否有任何信号已经到达的过程是:

 1) When context switch happens. 

希望这有助于一些延伸。