2. 编写程序child.c,实现如下功能,假设父进程先执行,父进程显示3行字符串;父进程向子进程发送软中断信号,等待子进程终止后,父进程输出结束信息”OK”,然后终止执行。子进程循环显示“I am a child”,当接收到父进程发来的软信号后会停止循环,显示“child exited”并终止执行。
时间: 2023-11-24 12:06:30 浏览: 110
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void child_handler(int signum) {
printf("\nchild exited\n");
exit(0);
}
int main() {
pid_t pid;
int i;
/* create child process */
pid = fork();
if (pid < 0) {
fprintf(stderr, "fork failed\n");
exit(1);
} else if (pid == 0) {
/* child process */
signal(SIGINT, SIG_IGN); /* ignore interrupt signal */
signal(SIGTERM, child_handler); /* handle termination signal */
while (1) {
printf("I am a child\n");
sleep(1);
}
} else {
/* parent process */
printf("parent process\n");
printf("line 1\n");
printf("line 2\n");
printf("line 3\n");
sleep(1);
kill(pid, SIGTERM); /* send termination signal to child */
wait(NULL); /* wait for child to terminate */
printf("OK\n");
exit(0);
}
}
```
解释:
1. 父进程先创建子进程,并向子进程发送信号 SIGTERM,表示要求子进程终止。
2. 子进程忽略 SIGINT 信号,即 Ctrl-C,否则子进程也会终止。
3. 子进程进入死循环,每隔 1 秒输出一次 "I am a child"。
4. 父进程输出 3 行字符串后,等待 1 秒钟,然后向子进程发送 SIGTERM 信号。
5. 子进程收到 SIGTERM 信号后,执行 child_handler 函数,输出 "child exited",并终止执行。
6. 父进程调用 wait 函数等待子进程退出,然后输出 "OK",并终止执行。
阅读全文