作业一:循环创建3个子进程,第一个退出方式为段错误,第二个为浮点数错误(除以0),第三个正常退出,父进程能回收三个子进程
时间: 2024-03-10 22:43:48 浏览: 18
下面是一个简单的 C 语言程序,可以创建三个子进程,分别采用不同的退出方式:
```c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
void sig_handler(int signo) {
printf("Received signal %d\n", signo);
exit(signo);
}
int main() {
pid_t pid1, pid2, pid3;
int status;
pid1 = fork();
if (pid1 == 0) {
printf("Child process 1 with PID %d\n", getpid());
int *ptr = NULL;
*ptr = 1; // 段错误
}
pid2 = fork();
if (pid2 == 0) {
printf("Child process 2 with PID %d\n", getpid());
int a = 1, b = 0;
int c = a / b; // 浮点数错误,除以0
}
pid3 = fork();
if (pid3 == 0) {
printf("Child process 3 with PID %d\n", getpid());
exit(0); // 正常退出
}
signal(SIGSEGV, sig_handler); // 注册段错误信号处理函数
signal(SIGFPE, sig_handler); // 注册浮点数错误信号处理函数
for (int i = 0; i < 3; i++) {
pid_t pid = wait(&status); // 等待子进程退出
printf("Child process with PID %d exited with status %d\n", pid, status);
}
return 0;
}
```
在程序中,分别使用了段错误和浮点数错误来退出两个子进程,同时使用了信号处理函数来处理这两种错误。第三个子进程正常退出。最后,父进程通过循环调用 wait() 函数来回收三个子进程。