【Linux进程】进程控制(中) {进程等待:等待的必要性,进程等待的方法wait,waitpid,退出状态status,waitpid非阻塞等待}
发布人:shili8
发布时间:2025-03-06 10:58
阅读次数:0
**Linux 进程控制 (中)**在上一篇文章中,我们讨论了 Linux 进程的基本概念、创建和管理进程的方法。现在,我们将继续探讨进程控制的另一个重要方面:进程等待。
**进程等待的必要性**
当一个父进程创建子进程后,它通常需要等待子进程结束,以便能够收集其退出状态并释放系统资源。在 Linux 中,进程等待是通过 `wait()` 和 `waitpid()` 系统调用实现的。
**wait() 系统调用**
`wait()` 系统调用用于等待任意一个子进程结束。它会阻塞当前进程直到有一个子进程结束,然后返回该子进程的退出状态。如果没有任何子进程结束,`wait()` 将一直阻塞。
c#include <sys/types.h> #include <unistd.h> int wait(int *status);
`wait()` 的参数 `status` 是一个指向 `int` 类型的指针,用于存储子进程的退出状态。如果 `wait()` 成功返回,则 `status` 中将包含子进程的退出状态。
**waitpid() 系统调用**
`waitpid()` 系统调用用于等待特定子进程结束。它比 `wait()` 更灵活,可以指定要等待的子进程 ID。
c#include <sys/types.h> #include <unistd.h> pid_t waitpid(pid_t pid, int *status, int options);
`waitpid()` 的参数 `pid` 是一个 `pid_t` 类型的值,表示要等待的子进程 ID。如果 `pid` 为0,则等待任意一个子进程结束。`status` 和 `options` 与 `wait()` 相同。
**退出状态 status**
当一个子进程结束时,它会返回一个退出状态给其父进程。这是通过 `wait()` 或 `waitpid()` 系统调用实现的。退出状态是一个整数值,表示子进程的终止原因。
c#define WIFEXITED(status) ((status) &0xFF)
`WIFEXITED()` 宏用于检查退出状态是否为正常结束(即非零)。如果是,则返回 `true`;否则返回 `false`。
**waitpid() 非阻塞等待**
在某些情况下,父进程可能需要立即继续执行,而不等待子进程结束。这种情况下,可以使用 `waitpid()` 的非阻塞选项 `WNOHANG`。
c#define WNOHANG0x10000int waitpid(pid_t pid, int *status, int options);
如果 `options` 中包含 `WNOHANG`,则 `waitpid()` 将立即返回,而不等待子进程结束。如果子进程已经结束,则 `status` 中将包含其退出状态;否则 `status` 将为 NULL。
cint main() { pid_t pid = fork(); if (pid ==0) { // 子进程 sleep(5); exit(123); } else { // 父进程 int status; waitpid(pid, &status, WNOHANG); printf("子进程退出状态:%d ", WIFEXITED(status)); } return0; }
在上面的示例中,父进程使用 `waitpid()` 的非阻塞选项等待子进程结束。如果子进程已经结束,则父进程会立即收到其退出状态;否则父进程将继续执行。
综上所述,`wait()` 和 `waitpid()` 系统调用用于等待子进程结束。`waitpid()` 比 `wait()` 更灵活,可以指定要等待的子进程 ID。退出状态是通过 `wait()` 或 `waitpid()` 系统调用实现的,可以使用 `WIFEXITED()` 宏检查是否为正常结束。最后,`waitpid()` 的非阻塞选项 `WNOHANG` 可以用于立即继续执行,而不等待子进程结束。