c语言实现信号回收子进程程序
时间: 2023-06-18 18:04:33 浏览: 181
进程管理程序c语言实现
5星 · 资源好评率100%
在 C 语言中,可以使用 signal 函数来指定信号处理函数,从而实现信号回收子进程。具体步骤如下:
1. 在主函数中,使用 fork 函数创建子进程。
2. 在子进程中,执行需要的任务。
3. 在主进程中,使用 signal 函数指定 SIGCHLD 信号的处理函数。SIGCHLD 信号是在子进程终止或停止时发送给父进程的信号。
4. 在信号处理函数中,使用 waitpid 函数回收子进程。waitpid 函数可以阻塞父进程,直到指定的子进程结束。
下面是一个示例程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
void sig_handler(int signo) {
if (signo == SIGCHLD) {
int status;
pid_t pid = waitpid(-1, &status, WNOHANG);
if (pid > 0) {
printf("Child process %d exited with status %d.\n", pid, status);
}
}
}
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程执行任务
printf("Child process %d is running.\n", getpid());
sleep(5);
printf("Child process %d finished.\n", getpid());
exit(0);
} else if (pid > 0) {
// 父进程等待子进程结束
signal(SIGCHLD, sig_handler);
while (1) {
sleep(1);
}
} else {
fprintf(stderr, "Failed to fork.\n");
exit(1);
}
return 0;
}
```
在上面的程序中,首先使用 fork 函数创建子进程。在子进程中,模拟执行一个需要 5 秒钟的任务,然后退出。在父进程中,使用 signal 函数指定 SIGCHLD 信号的处理函数为 sig_handler。在 sig_handler 函数中,使用 waitpid 函数回收子进程。最后,父进程进入一个死循环,防止程序退出。
阅读全文