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;
}