首页 > 系统相关 >进程的等待

进程的等待

时间:2023-04-01 13:55:31浏览次数:49  
标签:函数 pid wstatus 进程 等待 waitpid wait

关于进程等待

在子进程运行结束后,进入僵死状态,并释放资源,子进程在内核中的 数据结构 依然保留.
父进程调用wait()与waitpid()函数等待子进程退出后,释放子进程遗留的资源(task struct)

wait 与 waitpid

wait 函数

函数头文件
#include <sys/types.h>
#include <sys/wait.h>
函数原型
pid_t wait(int *wstatus ):
函数功能
让函数调用者进程进入到睡眠状态,等待子进程进入僵死状态后,释放相关资源并返回
函数参数
wstatus : 保存子进程退出状态值变量的指针获取具体值需要使用 WEXITSTATUS()宏定义
函数返回值
成功 : 返回退出子进程的 pid
失败 : 返回 -1

说明
会阻塞调用者进程(一般为父进程)
在子进程状态为僵死态时,回收资源,并释放资源后返回
示例:
创建一个子进程,延时35后退出,父进程等待子进程退出

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void){
  pid_t cpid;
  cpid = fork();
  if (cpid == -1){
    perror("[ERROR] fork():");
    exit(EXIT FAILURE);
    }
  else if(cpid == 0){
    printf("The Child process < %d > running...\n",getpid());sleep(3);exit(88);
    }
  else if(cpid > 0){
    int rpid,status = 8;
    rpid = wait(&status);
    if (rpid == -1){
      perror("[ERROR] wait() :");
      exit(EXIT FAILURE);
  }
      printf("The Child Process < %d > has exited,exit code < %d>.\n",rpid,WEXITSTATUS(status));//通过 WEIXTSTATUS() 宏定义获取
  }
  return e;
}

在 wait 存储在 satus 变量的值,存储了很多信息,通过一系列 W 开头的宏来解析获取WIFEXITED(status): 进程是否正常结束
WEXITSTATUS(wstatus): 获取进程退出状态值,exit函数的参数
WIFSIGNALED(wstatus): 表示该子进程是否被信号结束的,返回真,则表示被信号结束的
WTERMSIG(wstatus): 返回结束该子进程的那个信号的信号值0
WCOREDUMP(wstatus): 表示该子进程被信号唤醒的
WIFSTOPPED(wstatus): 表示该子进程是否被信号中上(stop)的,返回真,则表示是被信号中止的

waitpid 函数

waitpid 函数的功能与 wait 函数一样,但比 wait() 函数功能更强大,可以理解成 wait() 底层调用waitpid()函数

函数头文件
#include <sys/types.h>
#include <sys/wait.h>
函数原型
pid t waitpid(pid t pid, int *wstatus, int options):
函数参数
pid:进程id
-1: 可以等待任意子进程

0 :等待 id 为 pid 的进程
wstatus : 保存子进程退出状态值变量的指针
options : 选项
WNOHANG : 非阻塞选项
函数返回值
成功:
0:退出进程的 pid
=0:在非阻塞模式下,没有进程退出
失败:
-1 并设置 errno
示例: 创建一个子进程,子进程运行后 3s 退出,进程等待子进程退出


总结
waitpid 函数常见用法如下:
使用阻塞的方式等待任意子进程退出
waitpid(-1,&status,0);
使用非阻塞的方式等待特定子进程退出
while(waitpid(pid,&status,WNOHANG) != 0)
usleep(50000)

标签:函数,pid,wstatus,进程,等待,waitpid,wait
From: https://www.cnblogs.com/shubin/p/17278522.html

相关文章

  • C# 当前进程是否有控制台窗口
    WPF应用程序,在VS的项目属性中,可以设置输出类型:那我们在代码中,如何判断应用的类型呢。有没有控制台?是否Windows应用程序还是控制台应用程序?Kernel32下函数GetConsoleWindow可以解决这个问题:[DllImport("kernel32.dll")]privatestaticexternIntPtrGetConsoleWindow();1......
  • Linux系统下进程回收--wait()函数
    进程回收在每个进程退出的时候,内核释放该进程所有资源‘包括打开的文件、占用的内存等。但是仍然会保存一定的信息,这些信息主要是进程控制块PCB的信息(包括进程号、退出状态、运行时间等)。父进程可以调用wait()或waitpid()函数得到它的退出状态,同时彻底清除这个进程。wait()......
  • 进程间的五种通信方式介绍
    进程间通信(IPC,InterProcessCommunication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Streams支持不同主机上的两个进程IPC。以Linux中的C语言编程为例。一、管道管道,通常......
  • 进程相关命令
    一、ps命令功能显示当前进程的状态(ProcessStatus)语法ps[options]常用语法选项-A:列出所有的进程-e:与-A功能类似-W:显示加宽可以显示较多的资讯-au:显示较详细的信息-aux:显示所有包含其他使用者的进程示例:ps-aux显示所有进程的详细信息示例:ps-ef......
  • python远程监控linux进程
    1、效果图  2、配置文件  3、源码importparamikoimportioimportcoloramadefprocess(cfg):#创建SSH客户端ssh=paramiko.SSHClient()#自动接受新的主机密钥ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接到......
  • 孤儿进程和僵尸进程简介
    孤儿进程父进程运行结束后,但子进程还在运行(为运行结束),这样的子进程就称为孤儿进程(OrphanProcess)。每当出现一个孤儿进程的时候,内核几把故而进程的父进程设置为init(进程号为1),而init进程会循环地wait()已经退出的子进程。这样,当一个孤儿进程结束了其生命周期的时候,init进程......
  • ChCore—实验 3:进程与线程、异常处理 部分记录
    思考题1:内核从完成必要的初始化到用户态程序的过程是怎么样的?尝试描述一下调用关系。内核启动到用户程序启动的流程:main├──uart_init├──mm_init├──arch_interrupt_init├──create_root_thread│├──create_root_cap_group│├──__create_......
  • 如何限制进程内存:cgroup
    前两天刚知道cgroup,但是没用过,我就想做个简单的模拟OOM,网上搜了两天,发现一个比一个说的杂乱无章。 最后问的chatgpt:如何限制一个进程的内存在Linux系统中,可以使用cgroups来限制一个进程的内存。cgroups是一种内核机制,用于控制进程组的资源使用(CPU、内存、IO、网络等)。下面......
  • C# 当前进程是否有控制台窗口
    WPF应用程序,在VS的项目属性中,可以设置输出类型:那我们在代码中,如何判断应用的类型呢。有没有控制台?是否Windows应用程序还是控制台应用程序?Kernel32下函数GetConsoleWindow可以解决这个问题:[DllImport("kernel32.dll")]privatestaticexternIntPtrGetConsoleWindow();......
  • Linux 进程管理 | ps、top、kill
    ps可显示系统进程状况top可动态显示进程状况kill用来结束进程ps(ProcessStatus)ps命令用来列出系统中当前运行的进程,就是执行ps命令时的进程执行ps-auxwwf结......