[Linux] Linux C编程之wait函数详解 - 刘傲天

in 默认分类 with 0 comment

Wait函数详解

当你在你的程序当中需要另开一个进程的时候,注意不是线程,而是一个子进程,这个子进程是使用fork函数来实现的,我们今天讲的并不是fork这个函数,我们讲的是wait这个函数,这个函数的作用是等待子进程的结束并且可以通过这个函数获悉子进程是怎么样退出或者说结束的,也可以获得它的结束码,当然如果有的话。

wait原型

想要使用wait函数需要引入两个头文件

#include <sys/types.h>
#include <sys/wait.h>

// 下边是函数原型
pid_t wait(int *wstatus);

用途

当我们fork一个子进程的时候,有些情况下我们不需要等待子进程的结束,那我们就只管fork就可以了,但是如果我们需要把当前进程挂起,等待子进程结束之后在运行,那么我们就需要用到wait函数,这个函数会在调用的位置挂起,等待子进程结束继续运行。

解释

wait函数接收参数,这个参数是int 指针类型,也就是需要一个int类型变量的指针,之后我们就可以通过这个int类型的变量获悉子进程的退出状态,并且可以知道它是如何结束的。返回值则是结束进程的进程id,也就是pid,每个进程都有一个且唯一的pid,如果遇到错误,wait则返回-1,所以你应该检查这个返回值。

应用

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
  int my_pid = 0;

  /*
   * fork一个子进程
   */
  my_pid = fork();

  if (my_pid < 0) {
    perror("func fork");
  } else if (my_pid == 0) {
    printf("我是儿子,我的pid是:%d\n", getpid());
    printf("现在我开始出去找数字,让我爸爸等我\n");
    /*
     * 休眠五秒
     */
    sleep(5);
    // 带回数字15
    return 15;
  } else {
    int retnum = 0;
    printf("我是爸爸,我的pid:%d, 我要等待儿子回家\n", getpid());
    int pid = wait(&retnum);
    printf("我儿子带回来的数字是:%d,儿子的pid:%d\n", retnum >> 8, pid);
  }

  return 0;
}

编译运行

$:gcc waitdemo4.c

waitdemo4.c为我的文件名称

$:./a.out

以下为运行结果

我是爸爸,我的pid:6144, 我要等待儿子回家
我是儿子,我的pid是:6145
现在我开始出去找数字,让我爸爸等我
我儿子带回来的数字是:15,儿子的pid:6145
Responses