qq_康斯坦丁_0 的学生作业:
#include
#include
#include
#include
#include
#include
#include
// 子进程B的信号处理函数
void sig_handler(int signo) {
printf(“子进程B收到信号: %s\n”, strsignal(signo));
}
int main() {
pid_t pid1, pid2;
int status;
// 创建第一个子进程(A)
pid1 = fork();
if (pid1 < 0) {
perror("创建子进程A失败");
exit(1);
}
if (pid1 == 0) {
// 子进程A代码
printf("子进程A (PID: %d) 开始运行,使用默认信号处理方式\n", getpid());
while(1) {
sleep(1);
}
exit(0);
} else {
// 父进程继续创建第二个子进程(B)
pid2 = fork();
if (pid2 < 0) {
perror("创建子进程B失败");
exit(1);
}
if (pid2 == 0) {
// 子进程B代码
// 设置SIGUSR2的信号处理函数
if (signal(SIGUSR2, sig_handler) == SIG_ERR) {
perror("设置信号处理函数失败");
exit(1);
}
printf("子进程B (PID: %d) 开始运行,使用自定义信号处理函数\n", getpid());
while(1) {
sleep(1);
}
exit(0);
} else {
// 父进程代码
printf("父进程 (PID: %d) 创建了两个子进程: A(%d) 和 B(%d)\n", getpid(), pid1, pid2);
// 等待3秒,让子进程有时间打印信息
sleep(3);
// 向子进程A发送SIGUSR1信号
printf("\n父进程正在发送SIGUSR1信号给子进程A...\n");
if (kill(pid1, SIGUSR1) == 0) {
printf("成功发送SIGUSR1信号给子进程A (PID: %d)\n", pid1);
} else {
perror("向子进程A发送SIGUSR1信号失败");
}
// 向子进程B发送SIGUSR2信号
printf("\n父进程正在发送SIGUSR2信号给子进程B...\n");
if (kill(pid2, SIGUSR2) == 0) {
printf("成功发送SIGUSR2信号给子进程B (PID: %d)\n", pid2);
} else {
perror("向子进程B发送SIGUSR2信号失败");
}
// 等待一秒让信号处理完成
sleep(1);
// 终止子进程
printf("\n父进程正在终止子进程...\n");
kill(pid1, SIGKILL);
kill(pid2, SIGKILL);
// 等待子进程结束
waitpid(pid1, &status, 0);
printf("子进程A (PID: %d) 已终止\n", pid1);
waitpid(pid2, &status, 0);
printf("子进程B (PID: %d) 已终止\n", pid2);
printf("\n所有子进程已终止,父进程退出\n");
}
}
return 0;
}