关键代码逻辑
- 信号处理函数设置:父进程设置信号处理函数,用于处理子进程发来的信号。
- 信号屏蔽:父进程在创建子进程前屏蔽信号,防止信号提前到达。
- 子进程操作及信号发送:子进程执行一些操作后,发送信号给父进程。
- 父进程等待信号及后续操作:父进程解除信号屏蔽,等待信号到来,收到信号后执行后续操作。
核心代码片段
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
// 信号处理函数
void signal_handler(int signum) {
printf("父进程收到信号,继续后续操作\n");
}
int main() {
sigset_t set;
// 初始化信号集
sigemptyset(&set);
// 将SIGUSR1添加到信号集中
sigaddset(&set, SIGUSR1);
// 注册信号处理函数
signal(SIGUSR1, signal_handler);
// 屏蔽信号
sigprocmask(SIG_BLOCK, &set, NULL);
pid_t pid = fork();
if (pid == -1) {
perror("fork");
return 1;
} else if (pid == 0) {
// 子进程
printf("子进程开始执行操作\n");
// 模拟一些操作
sleep(2);
printf("子进程操作完成,发送信号给父进程\n");
kill(getppid(), SIGUSR1);
} else {
// 父进程
printf("父进程等待子进程信号\n");
// 解除信号屏蔽
sigprocmask(SIG_UNBLOCK, &set, NULL);
// 等待子进程结束
wait(NULL);
}
return 0;
}