学习记录第二十七天

news2024/9/22 19:35:54

进程

wait函数

功能
  • 等待子进程结束:父进程调用wait函数后,会暂停执行,直到它的某个子进程结束。
  • 收集子进程状态:当子进程结束时,wait函数会返回子进程的终止状态,包括是正常终止还是被信号终止等信息。

wait函数的基本原型如下:

#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);

  • 参数status是一个指向整数的指针,用来存储子进程的退出状态。如果不需要这个状态,可以传入NULL
  • 返回值:成功时,返回结束的子进程的PID;出错时,返回-1,并设置errno以指示错误。
注意事项
  • wait函数只等待一个子进程结束,如果有多个子进程,它会返回最先结束的那个子进程的PID。
  • 如果所有子进程都已经结束,wait函数会立即返回-1,并设置errno为ECHILD
  • 为了避免僵尸进程(已结束但父进程未通过wait等函数回收其资源的子进程),父进程应该及时调用wait或相关函数来回收子进程资源。
  • 在多线程程序中,使用wait函数可能需要考虑线程同步问题,因为wait函数会阻塞调用它的线程。

waitpid 

#include <sys/types.h>  
#include <sys/wait.h>  
  
pid_t waitpid(pid_t pid, int *status, int options);
 

参数说明
  • pid:指定要等待的子进程的PID。它有几个特殊的值:

    • > 0:等待指定PID的子进程。
    • 0:等待与调用进程属于同一进程组的任何子进程。
    • -1:等待任何子进程,与wait函数相似。
    • < -1:等待其组ID等于pid的绝对值的任何子进程。
  • status:用于存储子进程的退出状态。如果不需要,可以设置为NULL

  • options:控制waitpid的行为。它可以是0,表示默认行为(阻塞等待),或者使用以下选项的组合(通过|运算符连接):

    • WNOHANG:非阻塞模式。如果指定的子进程没有结束,则返回0而不是阻塞等待。
    • WUNTRACED:报告子进程的停止状态(比如,被信号暂停)。
    • WCONTINUED:如果子进程因为被SIGCONT信号唤醒而产生了SIGCHLD信号,则立即返回。
返回值
  • 成功时,返回结束的子进程的PID。
  • 如果设置了WNOHANG且没有子进程结束,则返回0。
  • 出错时,返回-1,并设置errno以指示错误。

非阻塞和阻塞

阻塞:会阻塞父进程处理逻辑

非阻塞:父进程会去查看子进程状态改变,但是 如果没有发生改变,父进程不阻塞,整个程序继续往下。非阻塞必须套在循环中处理

线程 

线程是计算机科学中的基本概念,指的是在一个进程中执行的独立指令流。以下是对线程的详细解释:

一、定义与特性

  • 定义:线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务。
  • 特性
    1. 独立调度和分派的基本单位:在多线程操作系统中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。
    2. 可并发执行:一个进程中的多个线程可以并发执行,甚至允许在一个进程中所有线程都能并发执行,同时,不同进程中的线程也能并发执行。
    3. 共享进程资源:同一进程中的各个线程都可以共享该进程所拥有的资源,如内存空间、文件句柄等,但每个线程又有自己的独立执行流和调用栈。

二、组成与结构

  • 线程由线程标识符、程序计数器、寄存器集合和堆栈组成。其中,线程标识符用于唯一标识一个线程;程序计数器用于指示线程当前执行的指令地址;寄存器集合用于存储线程执行过程中需要的各种数据;堆栈则用于存储线程调用函数时的局部变量和返回地址等。

 

三.为什么需要线程?

 线程 --- 轻量级的进程  
  进程 --- 重量级的进程 
  
  线程 成为 CPU执行的最小单位 
  进程 成为 资源分配的基本单位 

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


四. 线程与进程的关系


  a.线程 是 存在于 进程中的 
  b.线程 共享了进程的资源 (代码段,数据段,打开一些文件,信号等)
  c.线程结束,不一定导致进程结束 


  五.线程的编程


  类似与进程过程 
  
  线程函数 
  Red hat / IBM
         //thinkpad   
  ubuntu 
  contos //服务器上 --- linux系统运维 
  
  red hat 实现的一套线程函数 //NPTL线程库
  NPTL (New Posix Thread Library) 


  
  a.线程的创建  

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

   功能:该函数可以创建指定的一个线程。
    参数:
         @thread 线程id,需要实现定义并由该函数返回。
         @attr   线程属性,一般是NULL,表示默认属性。(可结合性+分离属性)
                 默认(可结合性) -- 自己手动回收
                 分离属性       -- 系统自动回收 
        @start_routine  -- 线程执行函数 (线程回调函数)
                //指向[指针函数的] 函数指针。
                  本质上是一个函数的名称即可。
                称为
                  th 回调函数,是线程的执行空间。
                  {
                  }
                //注: 线程回调函数 --完成线程任务功能的函数 
                //    需要调用者 自己实现
        @arg  回调函数的参数,即参数3的指针函数参数。
    返回值:成功 0
            失败 错误码        

获得线程tid:

 pthread_self(); //在那个线程中调用,获得的就是那个线程的tid 
 

b.线程的执行

 就体现在线程的 执行函数(回调函数)上

c.线程的退出

方式1 
   pthread_exit 
 
  void pthread_exit(void *retval)


    功能:
    结束调用的线程 
    参数:
  @retval  //退出状态值  //传的是,退出状态值 对应的地址 
 
    注意:
 1.pthread_exit 本身表示结束线程 如果用在main函数中 表示结束主线程 主线程结束 并不表示程 此时,主线程执行流结束,进程会在其余线程都结束后,结束 

 d.线程的资源回收 

int pthread_join(pthread_t thread, void **retval);


 功能:
      等待线程结束 
 参数:
    @thread  --- 线程tid  
    @retval  --- 用来保存,退出状态值,所在空间的地址 
 
返回值:
   成功 0
失败 错误码 
 注:
    线程退出时,可以带出退出状态值,但是传的是,退出状态值对应空间的地址

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

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

相关文章

单链表leetcode刷题/中(C语言版)

目录 题目1&#xff1a;合并两个有序链表 题目2&#xff1a;分割链表 题目3&#xff1a;随机链表的复制 “单链表leetcode刷题/上”的链接&#xff1a;https://blog.csdn.net/2302_80297338/article/details/140409360?spm1001.2014.3001.5501 题目1&#xff1a;合并两个有…

Ecovadis认证评估的四个方面 Ecovadis评估结果呈现形式

Ecovadis的认证过程严谨&#xff0c;基于国际公认的标准和准则进行评估。获得Ecovadis认证的企业&#xff0c;在社会责任、环境保护、商业道德和可持续采购等方面的表现得到了专业认可&#xff0c;这有助于提升企业的信誉度和透明度&#xff0c;增强利益相关者的信任。 Ecovad…

【CTF | WEB】003、攻防世界WEB题目之xff_referer

文章目录 xff_referer题目描述:解题思路&#xff1a;XFF与Referer基本了解1. XFF&#xff08;X-Forwarded-For&#xff09;&#xff1a;2. Referer&#xff1a;简单总结&#xff1a; 解题实操&#xff1a; xff_referer 题目描述: X老师告诉小宁其实xff和referer是可以伪造的。…

在 Linux 系统中下载 Python 并配置环境

哈喽&#xff0c;大家好&#xff0c;木易巷来啦&#xff01; 在 Linux 系统中下载 Python 并配置环境&#xff0c;主要包含以下几个核心步骤&#xff1a; ▍1、安装 Python 多数 Linux 发行版已预装 Python&#xff0c;但您可能需要安装不同版本或更新现有版本。 打开终端。 …

SpringBoot(Ⅰ)——HelloWorld和基本打包部署+Pom依赖概述+@SpringBootApplication注解+自动装配原理+约定大于配置

前言 如果SSM学的比较好&#xff0c;那么SpringBoot说白了就两件事:约定大于配置和自动装配 SpringBoot不会提供任何的功能拓展&#xff0c;完全依赖我们手动添加 所以SpringBoot的本质是一个依赖脚手架&#xff0c;可以快速集成配置各种依赖 1.1 SpringBoot相关依赖 创建…

失败:Windows--WSL2--Ubuntuon--Docker

编写目的&#xff1a; 在Windows上安装Docker&#xff0c;用Docker安装Gitlab、Jenkins等软件。 文章记录一下Windows上安装Docker的过程。 参考文档&#xff1a; 旧版 WSL 的手动安装步骤 | Microsoft Learn 下面用"参考文档"代替 目录 第一步&#xff1a;启…

学习计算机网络(三)——IP地址

一、IP协议&#xff08;IPV4、IPV6&#xff09; 表示形式&#xff08;两种&#xff09;&#xff1a; 点分十进制、二进制 地址被点分为4个部分&#xff0c;每个部分8位&#xff0c;总共32位。 A、B、C类地址都是单播地址&#xff08;一对一通信&#xff09;&#xff0c;D类…

谷粒商城实战笔记-175~177-商城业务-检索服务-检索查询接口开发

文章目录 一&#xff0c;175-商城业务-检索服务-检索查询参数模型分析抽取二&#xff0c;176-商城业务-检索服务-检索返回结果模型分析抽取三&#xff0c;177-商城业务-检索服务-检索DSL测试-查询部分四&#xff0c;178-商城业务-检索服务-检索DSL测试-聚合部分问题记录解决方案…

redis散列若干记录

字典 redis本身使用字典结构管理数据 redis使用hash表实现字典结构 使用了什么hash算法 使用SipHash算法&#xff0c;该算法能有效防止Hash表碰撞&#xff0c;并有不错的性能 hash冲突怎么解决 使用链表法解决hash冲突 hash表如何扩容 渐进式扩容&#xff0c;不会引起线程长期阻…

趣味算法------可截断素数

目录 题目描述&#xff1a; 思路解析&#xff1a; 质数判断函数&#xff1a; 反转函数&#xff1a; 右截断素数判断函数&#xff1a; 左可截断素数&#xff1a; 具体代码&#xff1a; 题目描述&#xff1a; 左截断素数是不包含 0 位的素数&#xff0c;当连续删除第一个数…

大四生都在的用8款AI论文生成器在线网站!

在当前的AI技术浪潮中&#xff0c;智能AI写作工具已经成为了学术研究和论文撰写的重要助手。对于大四生来说&#xff0c;选择合适的AI论文生成器可以大大提高写作效率和质量。以下是8款值得推荐的AI论文生成器在线网站&#xff1a; 一、千笔-AIPassPaPer 这是一款功能全面且高…

花几千上万学习Java,真没必要!(四十六)

Lambda表达式&#xff1a; 测试代码1&#xff1a; package test.lambda; public class LambdaDemo { // 实现Runnable接口的类 static class MyThread implements Runnable { Override public void run() { System.out.println("线程运行中&#xff1a;通过实现Runn…

【智能流体力学】ANSYS Fluent流体仿真基础、深度学习驱动思想及其CAX计算机辅助集成技术

目录 一、CAX计算机辅助集成技术二、计算机辅助工程(CAE)三、SCDM (Species Concentration Display Model) 显示和分析物质浓度分布的模型1. **SCDM概述**2. **主要功能**3. **功能特点**4. **使用步骤**5. **应用实例**6. **优点与限制**四、行业应用五、Fluent 软件功能1. …

Datawhale AI 夏令营 第四期 AIGC Task2

活动简介 活动链接&#xff1a;Datawhale AI 夏令营&#xff08;第四期&#xff09; 以及AIGC里面的本次任务说明&#xff1a;Task 2 精读代码&#xff0c;实战进阶 和上次任务一样&#xff0c;链接里的教程非常详细&#xff0c;对小白非常友好&#xff0c;从使用AI助手理解…

网工内推 | 网络、集成工程师,最高17K,NP以上认证优先

01 广东南方新媒体股份有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;岗位职责&#xff1a; 1、负责基础设施运维管理&#xff0c;包括机房环境设备、网络设备、安全设备与服务器等&#xff0c;负责机房设备上架、下架、位置调整、布线等的常规操作。…

day36——homework

二、基于UDP的TFTP文件传输 1&#xff09;tftp协议概述 简单文件传输协议&#xff0c;适用于在网络上进行文件传输的一套标准协议&#xff0c;使用UDP传输 特点&#xff1a; 是应用层协议 基于UDP协议实现 数据传输模式 octet&#xff1a;二进制模式&#xff08;常用&am…

数据同步工具DataX

目录 1.概要 2.简介 3.DataX处理异构数据源 4.DataX的框架 5.DataX的核心架构 6.DataX的安装 7.DataX的使用案例 8.mysql同步到mysql案例 1.概要 本篇文件将介绍一款数据同步工具DataX的原理&#xff0c;安装&#xff0c;以及使用。 2.简介 官网连接&#xff1a;https…

STL经典案例(二)——公司招员工

需求&#xff1a;公司招了十个员工ABCDEFGHIJ&#xff0c;公司有五个部门&#xff0c;公司随机给这十个员工分配薪水&#xff0c;并且随机将这十名员工分配到不同的部门。 员工类中成员属性为姓名和工资&#xff0c;成员方法为设置姓名、设置工资、获得姓名、获得工资 部门有五…

Electron 开发桌面应用程序用于对接USB Audio Class协议

开发用于对接USB Audio Class协议的Electron桌面应用程序是一个复杂的任务&#xff0c;可能涉及多个开源库和项目的组合。以下是一些开源项目和库&#xff0c;它们可以帮助你实现这个目标&#xff1a; 1. Electron Electron 是一个用于构建跨平台桌面应用程序的框架。你可以使…

【云原生】Prometheus Pushgateway使用详解

目录 一、前言 二、Pushgateway概述 2.1 什么是Pushgateway 2.1.1 Pushgateway在Prometheus中的位置 2.2 为什么需要Pushgateway 2.3 Pushgateway作用 2.4 Pushgateway 工作原理 2.5 Pushgateway 使用场景 2.6 Pushgateway 优缺点 三、Pushgateway 部署 3.1 二进制安…