【进程等待】waitpid的参数pid | status的位图&位操作&WIFEXITED&WEXITSTATUS宏

目录

waitpid

pid

status

status位图 

status按位操作

输入型参数和输入型参数 

宏WIFEXITED&WEXITSTATUS

options&非阻塞等待


上篇进程等待我们介绍到怎样去进程等待。我们介绍了wait函数&阻塞等待。本篇我们将介绍waitpid函数的参数pid和status。

waitpid

  • man 2 waitpid
  • 等待一个进程的状态发生变化
  • pit_t pid是父进程等待的子进程的pid,情况有3种,这里介绍两种情况。
  • int *status是NULL
  • int options是0
  • 先把后面两个参数设置为NULL和0

pid_ t waitpid(pid_t pid, int *status, int options);
返回值

  • 当正常返回的时候waitpid返回收集到的子进程的进程ID;
  • 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
  • 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;

参数
pid:

  • Pid=-1,等待任一个子进程。与wait等效。
  • Pid>0.等待其进程ID与pid相等的子进程。

status:

  • WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
  • WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)

options:

  • WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。

waitpid是一个在Unix和类Unix系统(如Linux)中常用的系统调用,用于等待一个或多个子进程的状态改变。与wait系统调用相比,waitpid提供了更多的灵活性,因为它允许你指定要等待的子进程的PID(进程ID),并可以设置等待的模式(阻塞或非阻塞)。

以下是waitpid函数的原型和参数详解:

pid_t waitpid(pid_t pid, int *status, int options);
  • pid:这是一个整数,用于指定要等待的子进程的PID。其取值有以下几种情况:
    • pid > 0:等待指定PID为pid的子进程。
    • pid = 0:等待当前进程组中的任何子进程。
    • pid = -1:等待任何子进程,与wait函数的功能相同。
    • pid < -1:等待组ID为-pid的任意子进程。
  • status:这是一个指向整数的指针,用于存储子进程的退出状态。如果不需要这些信息,可以将此参数设置为NULL。
  • options:这是一个位掩码,用于修改waitpid的行为。常见的选项有:
    • WNOHANG:使waitpid调用变为非阻塞。如果没有子进程满足条件,waitpid会立即返回。
    • WUNTRACED:当子进程被停止时(而不是退出时),也返回它的状态。这通常与跟踪被调试的子进程有关。
    • WCONTINUED:当被停止的子进程恢复时,返回它的状态。

waitpid的返回值有以下几种情况:

  • 如果成功,返回收集到的子进程的PID。
  • 如果设置了WNOHANG选项并且没有子进程满足条件,返回0。
  • 如果在调用中出现错误,返回-1,并设置全局变量errno以指示错误。

waitpid是一个非常有用的工具,允许你更精细地控制和管理你的子进程。

在系统编程中,`waitpid` 函数是一个用于等待进程状态变化的重要工具,尤其当需要非阻塞地检查子进程状态时,`WNOHANG` 标志提供了极大的灵活性。`waitpid` 函数的基本原型如下: ```c #include &lt;sys/wait.h&gt; pid_t waitpid(pid_t pid, int *status, int options); ``` 当 `options` 参数中设置了 `WNOHANG` 标志时,如果没有任何子进程已经终止或状态发生变化,则 `waitpid` 会立即返回,而不是阻塞等待。这种行为在实现异步进程监控或避免阻塞主线程的场景中非常有用。 例如,以下代码展示了如何使用 `waitpid` 与 `WNOHANG` 来非阻塞地检查子进程的状态: ```c #include &lt;sys/wait.h&gt; #include &lt;stdio.h&gt; #include &lt;unistd.h&gt; int main() { pid_t child_pid = fork(); if (child_pid == 0) { // 子进程 sleep(2); // 模拟子进程执行时间 return 0; } else if (child_pid &gt; 0) { int status; pid_t result; do { result = waitpid(child_pid, &amp;status, WNOHANG); if (result == 0) { printf(&quot;子进程尚未结束,继续做其他事情。\n&quot;); sleep(1); // 模拟其他工作 } } while (result == 0); printf(&quot;子进程结束。\n&quot;); } return 0; } ``` 在这个例子中,父进程通过 `waitpid` 与 `WNOHANG` 标志定期检查子进程是否已经结束,而不会阻塞自身执行。如果子进程尚未结束,`waitpid` 返回 `0`,父进程可以继续执行其他任务。一旦子进程结束,`waitpid` 将返回子进程PID,并通过 `status` 参数提供子进程的退出状态。 需要注意的是,`waitpid` 的 `pid` 参数决定了函数的行为。例如,当 `pid` 设置为 `-1` 时,`waitpid` 等待任何子进程的状态变化;当 `pid` 是一个正整数时,`waitpid` 只等待指定 PID 的子进程。[^1] 此外,`waitpid` 函数的 `options` 参数还可以与其他标志一起使用,以获得更精细的控制。例如,`WUNTRACED` 标志可以用来获取子进程因停止而产生的状态变化信息。 通过合理利用 `waitpid` 和 `WNOHANG` 标志,开发者可以在不阻塞主程序执行的情况下有效地管理和响应子进程的状态变化,这对于构建高效、响应性强的应用程序至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐唐思

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值