Linux系统编程(9)

news2024/9/23 11:15:12

一、wait函数

1.wait函数

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

wait函数有两个作用:

1.获取子进程 的退出状态

当父进程要获取子进程的退出状态时,子进程里需要使用exit函数(exit(退出状态值)退出状态值只有低八位有效,有效值的范围为0~255;

父进程通过wait或者waitpid函数来获取到推出状态值

wait函数中有系统定义的宏:

  • WIFEXITED(status): 如果子进程正常退出,则返回非零值。
  • WEXITSTATUS(status): 在子进程正常退出时,提取子进程的退出状态。
  • WIFSIGNALED(status)

    • 说明:如果子进程是因为接收到一个未捕获的信号而终止的(即异常终止),则返回非零值。
    • 用途:检查子进程是否因为信号而异常终止。
  • WTERMSIG(status)

    • 说明:在子进程异常终止的情况下(即 WIFSIGNALED(status) 为真),此宏返回导致子进程终止的信号编号。
    • 用途:获取导致子进程异常终止的信号编号。

2.回收资源

注意点:wait本身是一个阻塞操作,会使调用者阻塞。

2.waitpid函数

waitpid函数与wait函数有类似的作用。

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

参数说明

  • pid:

    • pid > 0: 等待进程ID等于 pid 的那个子进程。
    • pid == 0: 等待进程组ID与调用进程相同的任意子进程。
    • pid < -1: 等待进程组ID等于 |pid|(绝对值)的任意子进程。
    • pid == -1: 等待任意子进程(相当于调用 wait 函数)。
  • status:

    • 指向一个整数,用于存储子进程的退出状态。与 wait 函数相同,若不关心状态,可以传入 NULL
  • options:

    • 提供额外的选项来控制函数的行为。常见的选项有:
      • WNOHANG: 如果没有子进程退出,则立即返回,不等待,即非阻塞状态。

返回值

  • 成功时返回子进程的进程ID(PID)。
  • 如果没有子进程符合指定的条件,waitpid 返回 0(当 options 包含 WNOHANG 时)。
  • 如果调用失败(例如,pid 不合法),则返回 -1 并设置 errno

阻塞和非阻塞

阻塞状态下,父进程会等待子进程的状态发生改变,才会执行父进程后面的逻辑

非阻塞状态下,父进程会去查看子进程的状态是否发生改变,父进程不阻塞,整个父进程的逻辑继续往下执行。

非阻塞必须套在循环中,确保可以一直轮询子进程的状态。

二、线程

1.线程的概念

        “线程是CPU使用的基本单元,它由线程ID、程序计数器、寄存器集合和栈组成。它
与属于同一进程的其他线程共享代码段、数据段和其他操作系统资源,如打开文件和信号。
一个传统重量级(heavyweight)的进程只有单个控制线程。如果进程有多个控制线程,那
么它能同时做多个任务。”

线程又称为轻量级进程(light weight process)它是进程(Process)中的一个子任务.

线程和进程的关系:

        进程与线程之间的关系可以总结为:进程包含线程,一个进程至少包含一个线程(即主线程),多个线程在同一进程中并发执行任务。

        线程结束但是 进程不一定结束。

线程和进程的区别:

进程是资源分配的基本单位:每个进程都有自己独立的内存空间、文件描述符、全局变量、代码段等资源。操作系统为每个进程分配这些资源,确保进程之间的隔离和独立性。

 线程是CPU调度和执行的基本单位:线程是运行在进程内部的执行单元。一个进程可以包含一个或多个线程,所有线程共享进程的资源,但它们可以独立调度和执行。每个线程有自己的栈空间、寄存器和程序计数器,但它们共享同一进程的内存地址空间和其他资源。

为什么要用线程:使用线程可以大幅度的提高程序的运行速度和减少空间占用,使用多线程创建线程和调度都占用的资源都比多进程占用的资源少

2.线程的组成

线程上下文包含线程在执行时所需的所有信息。它通常包括:

  • 线程ID(Thread ID):线程唯一的标识符
  • 程序计数器(Program Counter, PC):指示当前线程执行的指令地址。每个线程都有自己的程序计数器,以确保线程能从上次停止的位置继续执行。
  • 栈(Stack):用于存储线程的局部变量、函数调用信息(如返回地址和调用者的上下文)等。每个线程有自己的栈,以支持线程的函数调用和局部变量存储。
  • 寄存器(Registers):线程的寄存器用于存储计算结果、地址等信息。每个线程有独立的寄存器集合。

3.线程编程

a. 线程创建

  • pthread_create
    • 功能:创建一个新线程。
    • int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                         void *(*start_routine)(void*), void *arg);
      
    • 参数
      • thread:指向pthread_t类型的变量,用于接收新线程的ID。
      • attr:线程的属性,通常为NULL使用默认属性(可结合性)(可结合性和分离属性)
      • 默认属性 结束后需要手动进行回收
      • 分离属性 结束后自动回收
      • start_routine:线程执行的函数, 函数指针 必须接受一个void*类型的参数并返回void*。本质上是一个函数的名称,该函数也被成为线程回调函数,通常需要调用者自己实现。
      • arg:传递给start_routine的参数。
    • 返回值:0表示成功,其他值表示错误代码。

线程创建成功后,关系如图所示

 主函数所在的执行流称为主线程,其他的线程执行流称为子线程 。

各个线程间的地位是对等的。

pthread_self()函数可以获取到调用该函数的线程的tid。

b.线程的执行体现在线程的执行函数中(回调函数)

b.线程的退出

pthread_exit

  • 功能:终止调用线程,并返回一个值给线程的调用者。
  •  
    void pthread_exit(void *retval);
    
    • 参数
      • retval:线程的返回值,可以是任何void*类型的指针。
    • 返回值:无返回值。调用pthread_exit后线程立即结束。

如果用在main函数中 表示结束主线程 

主线程结束不代表进程结束,

当主线程结束后,进程会在其余线程都结束后才会结束。

  • pthread_join

    • 功能:等待指定线程结束,并获取线程的返回值。
    •  
      int pthread_join(pthread_t thread, void **retval);
      
    • 参数
      • thread:要等待的线程ID。
      • retval:指向void*类型的指针,用于接收线程的返回值。
    • 返回值:0表示成功,其他值表示错误代码。
  • 注意:

    线程退出时,可以带出退出状态值,
    但是传的是,退出状态值对应空间的地址

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

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

相关文章

10:【stm32】USART与串口通信一:USART(上)

USART&#xff08;上&#xff09; 1、串口通信1.1、简介1.2、数据帧1.2.1、简介1.2.2、校验规则1.2.3、停止位的长度 1.3、异步通信的波特率1.3.1、同步通信1.3.2、异步通信1.3.3、硬件流控 2、USART2.1、简介2.2、工作的原理2.3、相关寄存器 3、标准库编程3.1、编程接口USART_…

day16-测试自动化之selenium的PO模式

一、PO模式介绍 PO&#xff08;Page Object&#xff09;模式是一种在自动化测试中常用的设计模式&#xff0c;将页面的每个元素封装成一个对象&#xff0c;通过操作对象来进行页面的交互。 一般分为六个版本&#xff0c;现在大部分企业都用的V4版本&#xff0c;三层结构…

redis面试(十六)公平锁释放和排队加锁

锁释放 RedissonFairLock.unlockInnerAsync()方法 这和加锁的逻辑没有太大区别 也就是说在客户端A他释放锁的时候&#xff0c;也会走while true的脚本逻辑&#xff0c;看一下有序集合中的元素的timeout时间如果小于了当前时间&#xff0c;就认为他的那个排队就过期了&#xf…

Spring自动注册-<bean>标签和属性解析

xml文件中最常见也最核心的就是<bean>,<Import>,<beans>,<alias>标签,关于它们的解析主要是BeanDefinitionParserDelegate类中.<bean>标签的解析最为复杂和重要. <bean>标签 processBeanDefinition(ele, delegate)方法中,主要是是对…

数据库管理-Redis

数据库管理-Redis 一、关系型数据库和非关系型数据库1、关系型数据库&#xff08;Relational Database Management System, RDBMS&#xff09;&#xff1a;2、非关系型数据库&#xff08;NoSQL Database Management System&#xff09;&#xff1a; 二、redis简述 redis是把数据…

苦WPS云盘已久矣

主要因为软件更新后&#xff0c;设置位置都会跑到其他地方 打开wps客户端后&#xff0c;点击电脑底部任务栏的云朵图标。 2. 找到存储位置后&#xff0c;点击“更换位置”。 来自https://www.wps.cn/mlearning/question/detail/id/333165.html

Java | Leetcode Java题解之第328题奇偶链表

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode oddEvenList(ListNode head) {if (head null) {return head;}ListNode evenHead head.next;ListNode odd head, even evenHead;while (even ! null && even.next ! null) {odd.next even.nex…

编程学习笔记秘籍:开启高效学习之旅

引言&#xff1a; “计算机科学教育不能使人成为程序员&#xff0c;就像学画笔和颜料不能使人成为画家一样。”——埃里克雷蒙德。在当今数字化的时代&#xff0c;编程如同一把神奇的钥匙&#xff0c;能够打开无数机遇的大门。然而&#xff0c;编程知识的海洋广阔无垠&#xff…

正也科技:医药营销管理数字化建设的重要性及其迭代方向

第三届MAH合作与创新大会暨浙江省医药产业博览会于上周在杭州圆满结束。会议汇集了众多医药领域的专家、行业领袖和企业家&#xff0c;共同探讨医药行业的转型之路与实战经验。在中国医药新趋势分论坛&#xff0c;与会人员重点讨论了当前中国医药产业在新环境下所面临的挑战、变…

文心快码 Baidu Comate 前端工程师观点分享:行业现状(二)

本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上&#xff0c;从一款文心快码&#xff08;Baidu Comate&#xff09;前端工程师的角度&#xff0c;分享了关于智能研发工具本身的研…

Hackademic.RTB1靶机复现

查看靶机的MAC地址 使用nmap进行扫描 使用dirsearch进行目录扫描 网站登录 点击紫色字体 进一步进行目录扫描 进行拼接 拼接wp-content 拼接wp-includes 点击Got root 测试发现不存在SQL注入 点击posted in Uncategorized 测试发现存在SQL注入 测试数据库 python sqlmap.py…

Linux-Shell三剑客grep,awk,sed-08

awk、grep、sed是linux操作文本的三大利器&#xff0c;合称文本三剑客&#xff0c;也是必须掌握的linux命令之一。三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;其中属awk功能最强大&#xff0c;但也最复杂。grep更适合单纯的查找或匹配文本&#xff0c;sed…

UDP通信如何测试使用

用户数据报协议(User Datagram Protocol,UDP)是一种无连接的传输层通信协议,用于互联网应用程序。与TCP(传输控制协议)不同,UDP提供了较少的服务并且不保证数据的可靠传输,但它以更少的系统资源消耗和更低的延迟作为交换,这使得UDP非常适合那些对速度要求高而对数据丢…

【LLM之RAG】GraphRAG论文阅读笔记

研究背景 本文探讨了大型语言模型&#xff08;LLM&#xff09;如何通过从外部知识源检索相关信息来回答关于私有或之前未见过的文档集合的问题。特别指出&#xff0c;传统的检索增强生成&#xff08;RAG&#xff09;系统在处理全局问题时存在局限性&#xff0c;例如问整个文本…

四种应用层协议——MQTT、CoAP、WebSockets和HTTP——在工业物联网监控系统中的性能比较

目录 摘要(Abstract) 实验设置 实验结果 节选自《A Comparative Analysis of Application Layer Protocols within an Industrial Internet of Things Monitoring System》&#xff0c;作者是 Jurgen Aquilina、Peter Albert Xuereb、Emmanuel Francalanza、Jasmine Mallia …

java计算机毕设课设—CRM客户关系管理系统((附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; java计算机毕设课设—CRM客户关系管理系统&#xff08;(附源码、文章、相关截图、部署视频) CRM客户关系管理系统是一种基于Java开发的系统&#xff0c;旨在帮助企业更有效地管理与客户的互动。该系统通过优化客户信息的组织和分析&#xff0c;增强…

【Electron】npm安装Electron项目失败报错问题和解决办法

前言 闲来无事&#xff0c;便想着研究一下Electron&#xff0c;没想到安装直接就卡住了 问题 npm ERR! RequestError: Hostname/IP does not match certificates altnames: Host: npm.taobao.org. is not in the certs altnames: DNS:*.tbcdn.cn, DNS:*.taobao.com, DNS:*.al…

pygame小游戏

代码存在一些bug&#xff0c;感兴趣可自行修改&#xff0c;游戏运行后玩法与吃金币游戏类似。&#xff08;代码及结果比较粗糙&#xff0c;仅供参考&#xff09; 注&#xff1a;&#xff08;图片、音乐、音效文件老是上传上传不上&#xff0c;想要可私&#xff0c;也可以自己找…

CentOS 7 安装详细教程

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; CentOS 7 是一个稳定的企业级 Linux 发行版&#xff0c;广泛用于服务器环境。CentOS 7 是基于 Red Hat Enterprise Linux (RHEL) 构建的企业级 Linux 发行版&#xff0c;提供免费的、开源的操作系统&#xf…

JVM-Java虚拟机-一文读懂-小白秒懂,老鸟进阶,必考面经

目录 JVM定义 Java Virtual Machine组成结构 各部分详解 0、类加载器 1、栈是运行的单位&#xff0c;堆是存储的单位 2、栈中存放各个栈帧 3、方法区——多线程共享区域 JVM定义 运行Java程序的平台内存结构、 垃圾回收、 类加载、 性能调优、 JVM 自身优化技术、 执行引…