进程状态和线程

news2024/9/22 15:17:36

一、wait(阻塞调用)    pid_t wait(int *status);

1.功能:(1)获取子进程退出状态      (2).回收资源    //会让僵尸态的子进程销毁 

参数

  • int *status: 指向一个整数的指针,wait 会通过这个指针返回子进程的状态信息。如果不关心状态信息,可以将其设置为 NULL

返回值

  • 如果成功,返回结束的子进程的进程 ID。
  • 如果没有子进程可等待或发生错误,返回 -1,并设置 errno

状态信息

通过传递给 status 的值,父进程可以使用一些宏来解析子进程的状态:

  • WIFEXITED(status): 如果子进程正常结束,返回非零值。
  • WEXITSTATUS(status): 如果子进程正常结束,返回其退出状态。
  • WIFSIGNALED(status): 如果子进程因信号而结束,返回非零值。
  • WTERMSIG(status): 返回导致子进程终止的信号编号。

2.父进程要获得子进程的退出状态 
    子进程
       exit(退出状态值)
       退出状态值 只有最低8位有效 [0~255]
    父进程
      wait(&status)
      获取到退出状态值
      WIFEXITED() //先判断是否为正常退出
      WEXITSTATUS() //获取到exit传递的退出状态值

示例:

二、waitpid(可以非阻塞调用)

  pid_t waitpid(pid_t pid, int *wstatus, int options);
功能:
     等待子进程状态发生变化 

参数

  • pid_t pid: 要等待的子进程的进程 ID(PID)。

    • 如果 pid 为 -1,等待任何一个子进程。
    • 如果 pid 大于 0,等待具有指定 PID 的子进程。
    • 如果 pid 小于 -1,等待进程组 ID 等于 |pid| 的任何子进程。
  • int *status: 指向一个整数的指针,用于存放子进程的状态信息。如果不关心,可以设置为 NULL

  • int options: 通常为 0,或者可以设置如 WNOHANG(非阻塞等待)等选项。

返回值

  • 如果成功,返回结束的子进程的进程 ID。
  • 如果没有该子进程,返回 0(在使用 WNOHANG 时)。
  • 如果出错,返回 -1,并设置 errno

状态信息

与 wait 一样,可以使用一些宏来解析状态信息,例如:

  • WIFEXITED(status): 子进程是否正常结束。
  • WEXITSTATUS(status): 获取子进程的退出状态。
  • WIFSIGNALED(status): 子进程是否因信号结束。
  • WTERMSIG(status): 获取导致终止的信号编号。      

  非阻塞调用:
  waitpid(-1,&wstatus,WNOHANG); //表示非阻塞调用 
  
  非阻塞 和 阻塞 
  1.阻塞 
       会父进程处理逻辑 
  2.非阻塞 
       父进程 会去查看 子进程状态改变
       但是,如果没有发生改变,父进程不阻塞,
       整个程序继续往下 
       非阻塞 必须 套在循环中处理  //轮询 

       
总结:
   1.wait 和 waitpid都是 等待子进程状态改变 
   2.wait 是一种阻塞调用
   3.waitpid 可以实现非阻塞调用 
  进程退出:
  处理方式 
  wait        //阻塞方式 --- 调用进程 一般不做额外的事情 
  waitpid     //非阻塞的方式 --- 调用进程 逻辑一般不受影响
                                waitpid 想要处理到子进程
                                必须套在循环中

三、线程

1.线程和进程

线程:(1)轻量级的进程。(2)成为CPU执行的最小单位

进程:(1)重量级的进程。(2)成为资源分配的基本单位

线程创建和调度的时空开销都比进程小;

(1)线程存在于进程中;

(2)线程共享了进程的资源;

(3)线程结束,进程不一定结束;

2.线程的组成:线程tid,程序计数器,寄存器集合,栈;

3.线程的创建:pthread_creat

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

参数说明

  1. pthread_t *thread: 指向 pthread_t 类型的变量的指针,用于存储新线程的tid。

  2. const pthread_attr_t *attr: 指向 pthread_attr_t 结构的指针,可以用来定义线程的属性。如果传入 NULL,将使用默认属性(自己手动回收),分离属性(系统自己回收)。

  3. void *(*start_routine)(void *): 指向将由新线程执行的函数的指针。该函数必须接受一个 void* 类型的参数,并返回一个 void*

  4. void *arg: 传递给 start_routine 的参数,可以用来传递数据给新线程。

返回值

  • 成功时返回 0
  • 失败时返回一个错误码,常见的错误包括:
    • EAGAIN: 系统资源不足。
    • EINVAL: 参数无效。
    • EPERM: 调用线程没有足够的权限来创建线程。

(1)编译时要联系   -lpthread.

(2)获得线程的tid   tid = pthread_self();

4.线程的执行(回调函数):
5.线程的退出(在回调函数中退出)

(1)pthread_exit     

参数

  • void *retval: 这是将要返回给调用 pthread_join 的线程的返回值。可以为 NULL(表示没有返回值)或任何其他类型的指针。

注意:在main函数中使用表示主线程结束,进程未结束,进程会在次进程都结束后,才会结束.

6.线程资源的回收:

                          pthread_join        

  1. pthread_t thread: 要等待的线程的tid,即你想要等待的线程。

  2. void **retval: 一个指向 void* 的指针的指针,用于存储线程的返回值。如果不需要返回值,可以将其设置为 NULL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qtday01

实现一个登录窗口 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置标题this->setWindowTitle("小黑子登录器");//设置图标this->setWindowIcon(QIcon("E:\\qt\\day1_04\\pictrue\\cxk.gif"));//固定…

移动APP测试有哪些注意事项?专业APP测试报告如何获取?

移动APP在其生命周期中有不同的阶段,从开始到投入目标市场再到被淘汰。移动APP的成功有多种因素,例如创建、部署、推广、粘性等。但是,创建出色APP的关键在于它的测试,软件测试负责为客户提供安全有效的产品,因此移动A…

Haproxy实现https

haproxy可以实现https的证书安全,从用户到haproxy为https,从haproxy到后端服务器用http通信 ,但是基于性能考虑,生产中证书都是在后端服务器比如nginx上实现。 配置HAProxy支持https协议,支持ssl会话: bind *:443 ssl crt /PATH/TO/SOME_PEM…

【C++ 面试 - 基础题】每日 3 题(十)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…

如何把命令行创建python虚拟环境与pycharm项目管理更好地结合起来

1. 问题的提出 我在linux或windows下的某个目录如“X”下使用命令行的方式创建了一个python虚拟环境(参考文章),对应的目录为myvenv, 现在我想使用pycharm创建python项目myproject,并且利用虚拟环境myvenv,怎么办&…

搭建jenkins+k8s过程中遇到的问题

1、k8s地址配置导致的一些个问题 Still waiting to schedule task ‘Jenkins’ doesn’t have label ‘k8s-jenkins-slave’ 出现以上异常一般就是k8s地址配置不对或者地址不通导致的 配置完k8s地址以及命名空间等内容之后,在获取k8s下的token 1.查看sa # kubectl get sa…

我的第一个CUDA程序

MatAdd算法 实现两个矩阵对应元素相加 MatAdd算法的GPU实现 CPU端为输入矩阵A和B、输出矩阵C分配空间,并进行初始化CPU端分配设备端内存,并将A和B传输到GPU上定义数据和线程的映射关系,并确定线程的开启数量和组织方式 每个线程负责输出矩阵…

EasyX自学笔记3(割草游戏1)

割草游戏,有玩家(上下左右控制移动)周围围绕子弹,敌人(随机刷新)向玩家靠近,子弹打死敌人,玩家与敌人触碰游戏结束。 分析需求 1.有玩家、敌人、子弹三种对象 2.玩家上下左右控制…

Spring MVC数据绑定和响应学习笔记

学习视频:12001 数据绑定_哔哩哔哩_bilibili 目录 1.数据绑定 简单数据绑定 默认类型数据绑定 简单数据类型绑定的概念 参数别名的设置 PathVariable注解的两个常用属性 POJO绑定 自定义类型转换器 xml方式 注解方式 数组绑定 集合绑定 复杂POJO绑定 属性为对象类…

力扣面试经典算法150题:最长公共前缀

最长公共前缀 今天的题目是力扣面试经典150题中的数组的简单题: 最长公共前缀 题目链接:https://leetcode.cn/problems/longest-common-prefix/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 编写一个函数来查找字符串数组中的最长公…

修改OpenSSH服务版本号

前言 这几年信息安全要求很高,奈何口号响亮掩盖不了我们技术基础依然很低的事实,加上风口烧钱和政绩工程等因素,于是就诞生了一些乱象,其中一个就是安全扫描胡乱标记,这里面的典型就是OpenSSH的漏洞扫描报告。 比如&…

人工智能小车——智能车臂控制平台

随着机器人技术的不断发展 ,各行业对机器人应用人才的需求也随之增加,培养符合行业发展需求的机器人技术专业人才成为了高校的重要任务。 基本介绍 智能车臂控制平台(ZI-AutoRB)是一套用以机器人控制技术学习和研究的软硬件系统。…

米联客-FPGA程序设计Verilog语法入门篇连载-10 Verilog语法_一般设计规范

软件版本:无 操作系统:WIN10 64bit 硬件平台:适用所有系列FPGA 板卡获取平台:https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1概述 本小节讲解Verilog语法的一般…

照片回收利器:最新数据恢复软件推荐

照片回收利器:最新数据恢复软件推荐 在今天的数字化时代,我们将大量珍贵的照片和个人数据存储在电脑、手机和其他设备中。然而,由于各种原因,这些数据可能会意外删除或丢失,这对我们来说是一个巨大的损失。因此&#…

【Redis】List类型

目录 List列表 命令 LPUSH LPUSHX RPUSH RPUSHX LRANGE LPOP RPOP LINDEX LINSERT LLEN lrem ltrim lset 阻塞版本命令 BLPOP BRPOP 内部编码 使用场景 消息队列 分频道的消息队列 作为栈或者队列 List列表 列表类型是⽤来存储多个有序的字符串&…

5 大场景上手通义灵码企业知识库 RAG

大家好,我是通义灵码,你的智能编程助手!最近我又升级啦,智能问答功能全面升级至 Qwen2,新版本在各个方面的性能和准确性都得到了显著提升。此外,行间代码补全效果也全面优化,多种编程语言生成性…

python-小理和他的猫(赛氪OJ)

[题目描述] 今天小理又要为他的猫小咪准备好吃的猫粮了,你愿意帮助一下他们么? 小理现在拥有的金钱数为 N ,有 M 种小咪喜欢的猫粮从左到右排列,已知每种猫粮的价格 ai​ ,他的购买规则如下: 1.必须按照从左…

数据结构与算法--图的存储与遍历

文章目录 回顾提要图的定义和表示图的表示完全图和子图顶点的度路径与回路连通图 邻接矩阵权和网 邻接表示例 深度优先遍历 (DFS)广度优先遍历 (BFS)广度优先遍历过程总结邻接矩阵存储结构邻接表存储结构 回顾 线索化二叉树:在某种次序遍历过程中创建线索&#xff…

简单数学运算(c语言)

1.描述 //牛牛最近学会了一些简单的数学运算,例如 //∑i1 ∑i 1 //请你帮他模拟一下这个运算。 (即 1 2 3.... n - 1 n) //输入描述: //输入仅一个正整数 n //输出描述: //请你计算 //∑i1n 2.就是递归函数 方法一&#xf…

40.【C语言】指针(重难点)(E)

目录 13.指针的使用和传址调用 14.数组名的理解 *数组名就是数组首元素的地址 *两个例外 *使用指针访问数组 *一维数组的传参本质 往期推荐 承接上篇39.【C语言】指针(重难点)(D) 13. 指针的使用和传址调用 见29.【C语言】函数系…