当前位置:实例文章 » 其他实例» [文章]【Linux进程】进程控制(中) {进程等待:等待的必要性,进程等待的方法wait,waitpid,退出状态status,waitpid非阻塞等待}

【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` 可以用于立即继续执行,而不等待子进程结束。

相关标签:网络
其他信息

其他资源

Top