当前位置: 首页 > news >正文

学习记录第二十七天

进程

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
失败 错误码 
 注:
    线程退出时,可以带出退出状态值,但是传的是,退出状态值对应空间的地址

相关文章:

学习记录第二十七天

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

servlet的执行顺序

执行的时候Tomcat先初始化 然后调用 server 根据server来回调请求方式下面会追入源码解释 package com.haogu.servlet;import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.…...

Go语言 类封装和绑定方法

本篇文章主要内容为Go语言类相关操作&#xff1a;封装和绑定方法介绍及示例。 目录 封装 绑定方法 类方法形参 指针形参 设置类方法参数 指针与非指针区别 总结 封装 go语言支持类的操作&#xff0c;但是没有class关键字&#xff0c;使用struct来模拟类。 示例如下&am…...

DirectShow过滤器开发-写WAV音频文件过滤器

下载本过滤器DLL 本过滤器将PCM音频流&#xff0c;或ADPCM&#xff0c;IEEE_FLOAT&#xff0c;ALAW&#xff0c;MULAW&#xff0c;GSM610音频流写入WAV音频文件。 写WAV音频文件过滤器信息 过滤器名称&#xff1a;写WAV 过滤器GUID&#xff1a;{CF704A9C-0C67-4712-BA33-DD0A…...

php根据截止时间计算剩余的时间,并且在剩余时间不足1天时仅显示小时数

//获取政策库文章public function getIndexZckList(){$fl_id = input(fl_id);if(empty(...

Docker最佳实践进阶(一):Dockerfile介绍使用

大家好,上一个系列我们使用docker安装了一系列的基础服务,但在实际开发过程中这样一个个的安装以及繁杂命令不仅仅浪费时间,更是容易遗忘,下面我们进行Docker的进阶教程,帮助我们更快速的部署和演示项目。 一、什么是Dockerfile? Dockerfile 是一个文本文件,其中包含了…...

Anything in Any Scene:无缝融入任何场景,实现逼真视频对象插入技术

人工智能咨询培训老师叶梓 转载标明出处 现实世界的视频捕获虽然因其真实性而宝贵&#xff0c;但常常受限于长尾分布的问题&#xff0c;即常见场景过度呈现&#xff0c;而关键的罕见场景却鲜有记录。这导致了所谓的"分布外问题"&#xff0c;在模拟复杂环境光线、几何…...

安卓开发中的AppCompat框架|安卓系统|安卓应用|兼容性|UI组件|核心组件|ActionBar|Fragment|最佳实践|框架|移动开发|移动应用

目录 1. 什么是AppCompat框架 1.1 AppCompat的起源 1.2 AppCompat的重要性 2. AppCompat框架的核心组件 2.1 AppCompatActivity 2.2 AppCompat主题 2.3 AppCompat Widgets 3. 在项目中使用AppCompat框架 3.1 添加依赖项 3.2 应用AppCompat主题 4. AppCompat的高级功…...

React使用useRef ts 报错

最近在写自己的React项目&#xff0c;我在使用useRef钩子函数的时候发现 TS2322: Type MutableRefObject<HTMLDivElement | undefined> is not assignable to type LegacyRef<HTMLDivElement> | undefined Type MutableRefObject<HTMLDivElement | undefined&g…...

python-信息交互-pyautogui

python-信息交互-pyautogui 一: pyautogui1> waht?2> 功能分类3> 概念及作用二: 通用功能1> function all2> function 注释三: 鼠标控制1> mouse functions2> mouse functions demo3> mouse drag demo四: keyboard控制1> keyboard functions2> …...

flink1.18 编译遇到的问题

1. flink-runtime-web编译失败 源码编译时一直卡在 [INFO] Running ‘npm ci --cache-max0 --no-save’ in 处理方法&#xff1a; 修改flink-runtime-web/pom.xml文件 将<arguments>ci --cache-max0 --no-save ${npm.proxy}</arguments> 替换为&#xff1a;<a…...

2024年8月份编译Openwrt系统基础

概述&#xff1a; 本文档记录openwrt系统的编译过程&#xff0c;以备后续再用&#xff0c;技术支持与指导&#xff01; 1.编译环境 环境需要Linux&#xff0c;我使用的环境是WSL2、Ubuntu 20.04 2.安装编译必须的依赖&#xff08;wsl、linux&#xff09; WSL2&#xff1a;Bu…...

Vue3+vite+ts 项目使用mockjs

1、安装mockjs npm i mockjs 2、安装vite-plugin-mock npm i vite-plugin-mock -D 3、安装axios npm i axios 4.在src目录下创建mock文件夹,在文件夹内创建login.ts等文件&#xff0c;并在文件夹内放置以下内容&#xff08;注&#xff1a;URL要和真实请求地址保持一致&am…...

动态规划(二)——例题

目录 Help Jimmy 题目 解题思路 神奇的口袋 题目 枚举的解法 递归的解法 动态规划的解法 滑雪 题目 解题思路 解法一 解法二 Help Jimmy 题目 "Help Jimmy" 是在下图所示的场景上完成的游戏&#xff1a; 场景中包括多个长度和高度各不相同的平台。地面是…...

Node.js中判断是文件还是文件夹的多种方法

在Node.js中&#xff0c;我们经常需要判断一个路径是文件还是文件夹。Node.js提供了多种方法来实现这一功能&#xff0c;本文将详细介绍这些方法&#xff0c;并给出相应的示例代码。 一、使用fs.Stats对象 在Node.js中&#xff0c;fs模块提供了fs.stat()或fs.statSync()方法&…...

idea 如何打war包

idea 如何打war包 1.在IntelliJ IDEA中打包WAR文件&#xff0c;你可以按照以下步骤操作:1.设置项目结构:首先&#xff0c;打开IDEA&#xff0c;选择File>Project Structure(或使用快捷键CtrlAltShiftS)。在打开的窗口中&#xff0c;选择 Artifacts 选项 2.添加Web Applicat…...

米联客-FPGA程序设计Verilog语法入门篇连载-15 Verilog语法_跨时钟域设计

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

gradio 对话界面实现支持图片、视频正常显示

参考: https://www.gradio.app/docs/gradio/chatbot 问题: gradio网页输出视频nan;图片webp显示不出来 解决方法:需要通过gradio的Video、Image包装 代码: 这里下面启动个后端vlm模型(参考:https://blog.csdn.net/weixin_42357472/article/details/141126225),前端通…...

催收业务怎么提高接通率

提高催收呼叫业务的接通率是一个综合性的任务&#xff0c;需要从多个方面进行优化。以下是一些具体的策略和建议&#xff1a; 一、优化呼叫时间与频次 1. 选择合适的呼叫时间&#xff1a;通过分析目标客户的活跃时段&#xff0c;选择他们最可能接听电话的时间进行呼叫…...

动态生成sitemaps和robots.txt文件:提升SEO与网站可爬性

本文由 ChatMoney团队出品 在现代Web开发中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;是网站成功的关键因素之一。搜索引擎通过网络爬虫来索引网页&#xff0c;而sitemaps和robots.txt文件则是帮助这些爬虫更好地理解和索引网站内容的重要工具。 sitemaps简介 Sit…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

raid存储技术

1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划&#xff0c;涵盖存储系统的布局、数据存储策略等&#xff0c;它明确数据如何存储、管理与访问&#xff0c;为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...

Android Framework预装traceroute执行文件到system/bin下

文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数&#xff08;使用 ICMP Echo 请求&#xff09;-T 参数&#xff08;使用 TCP SYN 包&#xff09; 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11&#xff0c;在/s…...