【Linux详解】进程的状态 | 运行 阻塞 挂起 | 僵尸和孤儿状态
在Linux中,进程可以处于多种状态,其中常见的有运行状态(Running)、阻塞状态(Blocked)、就绪状态(Ready)以及僵尸状态(Zombie)。
- 运行状态:进程正在CPU上运行。在单核处理器的系统中,每个时刻只有一个进程处于运行状态。在多核处理器的系统中,多个进程可以同时运行。
- 阻塞状态:进程由于等待某个事件(如等待I/O操作的完成)而无法继续运行,导致自身暂时不可运行。当等待的事件发生时,进程将从阻塞状态转换为就绪状态,等待CPU调度执行。
- 就绪状态:进程已经准备好,等待CPU分配执行时间。一旦获得CPU时间,进程即可立即执行。
- 僵尸状态:进程已经终止,但其父进程还没有使用
wait()
或waitpid()
系统调用来读取子进程的退出状态,这时子进程的进程描述符仍然保留在系统中,但是不再是一个执行进程。
示例代码:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程
printf("Child PID: %d\n", getpid());
sleep(10); // 子进程睡眠10秒钟
_exit(0); // 子进程正常退出
} else {
// 父进程
int status;
pid_t child_pid = waitpid(pid, &status, 0);
if (WIFEXITED(status)) {
printf("Child %d exited with status %d\n", child_pid, WEXITSTATUS(status));
}
}
return 0;
}
在这个示例中,父进程使用waitpid()
函数等待子进程结束,子进程通过sleep(10)
函数模拟休眠状态,然后通过_exit(0)
正常退出。父进程通过waitpid()
获取子进程的退出状态,并打印出来。如果子进程处于僵尸状态,父进程将无法获取其退出状态,因为该状态已不再可用。
评论已关闭