长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 文件操作

  • Linux进程和线程

    • 进程创建
    • 在进程中启动程序
    • 等待进程结束
      • 等待进程结束
      • waitpid函数参数
      • 示例代码
        • 子进程正常结束
        • 子进程异常退出
    • 线程简介
    • 多线程编程举例
    • 线程同步
    • 线程属性
  • Linux信号

  • 进程间通信

  • Socket

  • C语言
  • Linux进程和线程
DC Wang
2023-02-17
目录

等待进程结束

# 等待进程结束

# 等待进程结束

wait函数族最重要的两个函数是wait和waitpid函数

#include<sys/types.h>
#include<sys/wait.h>
pid_t wait (int * status);
pid_t waitpid(pid_t pid, int* status, int options);
1
2
3
4
  • waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束,并收集子进程的资源。如果在调用waitpid时子进程已经结束,则waitpid会立即返回子进程结束状态值。子进程的结束状态值由参数status返回,而子进程的进程号也会一并返回。如果执行成功则返回子进程号(PID),如果有错误发生则返回-1。失败原因存于errno中。

# waitpid函数参数

pid_t waitpid(pid_t pid, int* status, int options);
1
  • pid:欲等待的子进程号

  • status:保存子进程的结束状态

  • option:可以为0或下面的OR组合:

    • WNOHANG 如果没有任何已经结束的子进程则马上返回
    • WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。

# 示例代码

等待子进程结束

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{  
    pid_t child;   
    int status, child_pid;    
    if((child = fork()) == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    } else if(child == 0) {
        puts("in child");
        printf("\tchild pid = %d\n", getpid());
        printf("\tchild ppid = %d\n", getppid());
        // getchar();
        exit(EXIT_SUCCESS);
    } else {	/* Wait for the child to exit */
        child_pid = waitpid(child, &status, 0); 
        printf("in parent\n");
        printf("\tparent pid = %d\n", getpid());
        printf("\tchild exited with %d\n", status);
        printf("\tchild pid is %d\n", child_pid);
        // getchar();
    }
    exit(EXIT_SUCCESS);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 子进程正常结束

执行结果

$ ./waitpid
in child
        child pid = 2731
        child ppid = 2730
in parent
        parent pid = 2730
        child exited with 0
        child pid is 2731
1
2
3
4
5
6
7
8
  • 子进程先执行,父进程等待子进程完成。

  • 子进程正常退出,status为0。

  • 父进程通过waitpid函数返回值获得子进程的进程号。

# 子进程异常退出

打开上述代码的两个getchar注释,父子进程都会等待字符输入。

按下面步骤

  1. 执行./waitpid
  2. 新开一个终端,执行ps -aux查看所有进程,找到waitpid对应的父子进程
  3. 杀死子进程,kill -9 子进程ID
  4. 查看输出
# 终端1
$ ./waitpid
in child
        child pid = 2738
        child ppid = 2737

1
2
3
4
5
6
# 终端2
$ ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user      2737  0.1  0.0  10416   440 tty4     S    21:40   0:00 ./waitpid
user      2738  0.0  0.0  10548   380 tty4     S    21:40   0:00 ./waitpid
1
2
3
4
5
# 终端2
$ kill -9 2738
1
2
# 终端1
$ ./waitpid
in child
        child pid = 2738
        child ppid = 2737
in parent
        parent pid = 2737
        child exited with 9
        child pid is 2738
1
2
3
4
5
6
7
8
9

child exited with 9,status为9。

编辑 (opens new window)
#C#Linux#进程
上次更新: 2023/02/18, 10:09:42
在进程中启动程序
线程简介

← 在进程中启动程序 线程简介→

最近更新
01
ESP32-网络摄像头方案
06-14
02
ESP32-PWM驱动SG90舵机
06-14
03
ESP32-实时操作系统freertos
06-14
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式