我正在研究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) {};
}
}
我希望该程序将被挂起,但每次都运行良好。
答案 0 :(得分:0)
如果进程不忽略它们,它们总是会收到信号(signal(SIGnum, SIG_IGN);
)。
可以通过设置信号屏蔽来延迟忽略的信号(例如,使用sigprocmask
,对其进行屏蔽,然后再发送待处理的信号),或者如果过程停止,则将其延迟(使用{{1} } / SIGSTOP
;将SIGTSTOP
发送到进程会导致发送待处理信号。 (请注意,非实时信号可能会合并。例如,当您发送3次信号时,您可能只会收到一次。)
诸如SIGCONT
之类的阻止调用会阻塞/暂停该过程,直到完成或直到信号传递将其中断为止。
屏蔽信号(例如,使用wait
)有时被称为阻塞信号(不可交付),但这不同于阻塞/休眠/挂起进程(阻塞它在处理器上运行)的阻塞系统调用。 CPU)。