父进程在挂起时仍会接收信号

时间:2019-06-09 16:26:13

标签: c linux signals system

我正在研究Linux编程中的过程,有一些我无法理解的代码。据我所知,当一个进程挂起时,它不会接收信号(唤醒它的信号除外),但是在这段代码中,当父进程正在运行时,它会调用wait,但仍会打印出计数器,这意味着它已收到SIGUSR1。谁能解释一下?

我已经知道顺序或运行是任意的,如果子进程先运行则没有问题,但是如果父进程先运行怎么办?

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
pid_t pid;
int counter = 0;
int status;
void handler1(int sig){counter ++;
  printf("counter = %d\n", counter);
  fflush(stdout);
  kill(pid, SIGUSR1);
}void handler2(int sig){counter += 3;
  printf("counter = %d\n", counter);
  exit(0);
}
int main() {
  signal(SIGUSR1, handler1);
  if ((pid = fork()) != 0) {
    pid_t p;
    if ((p = wait(&status)) > 0) {
      counter += 2;
      printf("counter = %d\n", counter);
    }
  } else {
    signal(SIGUSR1, handler2);
    kill(getppid(), SIGUSR1);
    while(1) {};
  }
}

我希望该程序将被挂起,但每次都运行良好。

1 个答案:

答案 0 :(得分:0)

如果进程不忽略它们,它们总是会收到信号(signal(SIGnum, SIG_IGN);)。

可以通过设置信号屏蔽来延迟忽略的信号(例如,使用sigprocmask,对其进行屏蔽,然后再发送待处理的信号),或者如果过程停止,则将其延迟(使用{{1} } / SIGSTOP;将SIGTSTOP发送到进程会导致发送待处理信号。 (请注意,非实时信号可能会合并。例如,当您发送3次信号时,您可能只会收到一次。)

诸如SIGCONT之类的阻止调用会阻塞/暂停该过程,直到完成或直到信号传递将其中断为止。

屏蔽信号(例如,使用wait)有时被称为阻塞信号(不可交付),但这不同于阻塞/休眠/挂起进程(阻塞它在处理器上运行)的阻塞系统调用。 CPU)。