为了正确释放子进程,父进程应该调用 wait()
函数来收集子进程的退出状态,从而防止子进程成为僵尸进程。以下是修改后的代码示例,其中包含了释放子进程的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h> // 包含 wait() 的头文件
void simulate_ksmtuned_behavior() {
pid_t pid = fork(); // 创建一个子进程
if (pid < 0) {
perror("fork failed");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 子进程代码,模拟某种处理
printf("Child process (simulating ksmtuned behavior) with PID %d\n", getpid());
sleep(3); // 模拟一些工作
printf("Child process exiting...\n");
exit(EXIT_SUCCESS); // 正常退出
} else {
// 父进程代码
printf("Parent process PID %d created child PID %d\n", getpid(), pid);
// 等待子进程结束并收集其状态
int status;
waitpid(pid, &status, 0); // 收集子进程的退出状态
if (WIFEXITED(status)) {
printf("Child process exited with status %d\n", WEXITSTATUS(status));
}
printf("Parent process is exiting...\n");
}
}
int main() {
simulate_ksmtuned_behavior();
return 0;
}
修改点说明:
- 引入
<sys/wait.h>
:这是为了使用wait()
或waitpid()
函数。 - 调用
waitpid()
:在父进程中添加了对waitpid()
的调用,这样可以等待子进程完成,并获取其退出状态。这样就避免了产生僵尸进程。
通过这种方式,当子进程完成后,其资源会被父进程回收,确保系统资源得到合理管理。
内容由零声教学AI助手提供,问题来源于学员提问