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

I/O进程4

  • day4
    • 九、信号灯集
      • 1.概念
        • 信号灯(semaphore),也叫信号量。它是不同进程间或一个给定进程内部不同线程间同步的机制;System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。 通过信号灯集实现共享内存的同步操作。
      • 2.编程
        • (1).创建key值
        • (2).创建或打开信号灯集:semget(semaphore)
        • (3).初始化信号灯:semctl
        • (4).PV操作:semop
        • (5).删除信号灯集:semctl
      • 3.函数接口
        • int semget(key_t key, int nsems, int semflg);
        • 功能:创建/打开信号灯
        • 参数:
        • key:ftok产生的key值    
        • nsems:信号灯集中包含的信号灯数目    
        • semflg:信号灯集的访问权限,通常为IPC_CREAT |IPC_EXCL |0666
        • 返回值:成功:信号灯集ID        失败:-1                                                                                         
        •  int semctl ( int semid, int semnum, int cmd…/*union semun arg*/);
        • 功能:信号灯集合的控制(初始化/删除)
        • 参数:
        • semid:信号灯集ID    
        • semnum: 要操作的集合中的信号灯编号    
        •  cmd:        
        • GETVAL:获取信号灯的值,返回值是获得值        
        • SETVAL:设置信号灯的值,需要用到第四个参数:共用体        
        • IPC_RMID:从系统中删除信号灯集合
        • 返回值:成功 0       失败 -1
        • 用法:初始化: union semun{     int val; }mysemun; mysemun.val = 10;                                                                               
        •  semctl(semid, 0, SETVAL, mysemun);
        • 获取信号灯值:函数semctl(semid, 0, GETVAL)的返回值
        • 删除信号灯集:semctl(semid, 0, IPC_RMID);                                         
        •  int semop ( int semid, struct sembuf *opsptr, size_t nops);
        • 功能:对信号灯集合中的信号量进行PV操作
        • 参数:
        • semid:信号灯集ID      
        • opsptr:操作方式      
        • nops: 要操作的信号灯的个数 1个
        • 返回值:成功 :0       失败:-1
        • struct sembuf {    short sem_num; // 要操作的信号灯的编号    short sem_op; // 0 : 等待,直到信号灯的值变成0           // 1 : 释放资源,V操作                    // -1 : 申请资源,P操作     short sem_flg; // 0(阻塞),IPC_NOWAIT, SEM_UNDO };
        • 用法:
        • 申请资源 P操作:    
        • mysembuf.sem_num = 0;    
        • mysembuf.sem_op = -1;    
        • mysembuf.sem_flg = 0;    
        • semop(semid, &mysembuf, 1);
        • 释放资源 V操作:    
        • mysembuf.sem_num = 0;    
        • mysembuf.sem_op = 1;    
        • mysembuf.sem_flg = 0;    
        • semop(semid, &mysembuf, 1);
    • 十、消息队列
      • 1.特点
        • (1).消息队列是一种IPC对象,由消息队列ID来唯一标识
        • (2).消息队列就是一个消息的列表,用户可以在消息队列中添加消息,读取消息
        • (3).消息队列可以按照类型来进行消息的添加与读取
        • (4).消息队列是存在linux内核中,以链表的形式进行存放
      • 2.编程步骤
        • (1).创建key值
        • (2).创建或打开消息队列
        • (3).使用:添加消息:按照类型将消息添加到已打开的消息队列末尾 读取消息:按照类型从消息队列中读取消息
        • (4).删除消息队列
      • 3.函数接口
        • int msgget(key_t key, int flag);
        • 功能:创建或打开一个消息队列
        • 参数: key值        flag:创建消息队列的权限IPC_CREAT|IPC_EXCL|0666
        • 返回值:成功:msgid        失败:-1                                                                                               
        • int msgsnd(int msqid, const void *msgp, size_t size, int flag);
        • 功能:添加消息
        • 参数:
        • msqid:消息队列的ID      
        • msgp:指向消息的指针。常用消息结构msgbuf如下:           struct msgbuf{             long mtype; //消息类型             char mtext[N]}; //消息正文    
        • size:发送的消息正文的字节数    
        • flag:IPC_NOWAIT消息没有发送完成函数也会立即返回          0:直到发送完成函数才返回
        • 返回值:成功:0       失败:-1
        • 使用:msgsnd(msgid, &msg,sizeof(msg)-sizeof(long), 0)
        • 注意:消息结构除了第一个成员必须为long类型外,其他成员可以根据应用的需求自行定义。                                                                                            
        • int msgrcv(int msgid, void* msgp, size_t size, long msgtype, int flag);
        • 功能:读取消息
        • 参数:
        • msgid:消息队列的ID      
        • msgp:存放读取消息的空间    
        • size:接受的消息正文的字节数    
        • msgtype:0:接收消息队列中第一个消息。             大于0:接收消息队列中第一个类型为msgtyp的消息.             小于0:接收消息队列中类型值不小于msgtyp的绝对值且类型值又最小的消息。    
        •  flag:0:若无消息函数会一直阻塞        
        • IPC_NOWAIT:若没有消息,进程会立即返回ENOMSG
        • 返回值:成功:接收到的消息的长度       失败:-1                                                                                                
        • int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );
        • 功能:对消息队列的操作,删除消息队列
        • 参数:
        • msqid:消息队列的队列ID      
        • cmd:        
        • IPC_STAT:读取消息队列的属性,并将其保存在buf指向的缓冲区中。        
        • IPC_SET:设置消息队列的属性。这个值取自buf参数。        
        • IPC_RMID:从系统中删除消息队列。      
        • buf:消息队列缓冲区
        • 返回值:成功:0       失败:-1
        • 用法:msgctl(msgid, IPC_RMID, NULL)
      • 4.命令
        • ipcs -q:查看系统中消息队列
        • ipcrm -q msgid:删除系统中的消息队列
    • 十一、线程:实现多任务编程
      • 1.概念
        • 线程是一个轻量级的进程,为了提高系统性能引入的线程 Linux里同样用task_struct来描述一个线程。 线程和进程都参与统一的调度。
      • 2.进程与线程的区别
        • 共性:都为操作系统提供了并发执行能力。
        • 不同点: 调度和资源:线程是系统调度的最小单位,进程是资源分配的最小单位。地址空间方面:同一个进程创建的多个线程共享进程的资源;进程的地址空间相互独立。通信方面:线程通信相对简单,只需要通过全局变量可以实现,但是需要考虑临界资源访问的问题;进程通信比较复杂,需要借助进程间的通信机制(借助3g-4g内核空间)。安全性方面:线程安全性差一些,当进程结束时会导致所有线程退出;进程相对安全。
      • 3.线程资源
        • 共享的资源:可执行的指令、静态数据、进程中打开的文件描述符、信号处理函数、当前工作目录、用户ID、用户组ID
        • 私有的资源:线程ID (TID)、PC(程序计数器)和相关寄存器、堆栈、错误号 (errno)、信号掩码和优先级、执行状态和属性
      • 4.函数接口
        • 4.1创建线程
          • int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
          • 功能:创建线程
          • 参数:
          • thread:线程标识            
          • attr:线程属性,NULL:代表设置默认属性            
          • start_routine:函数名:代表线程函数            
          • arg:用来给前面函数传参
          • 返回值:成功:0               失败:错误码
        • 4.2退出线程
          • int pthread_exit(void *value_ptr)
          • 功能:用于退出线程的执行
          • 参数:value_ptr:线程退出时返回的值(任意类型)
          • 返回值:成功 : 0         失败:errno
        • 4.3线程回收
          • int pthread_join(pthread_t thread, void **value_ptr)
          • 功能:用于等待一个指定的线程结束,阻塞函数
          • 参数:
          • thread:创建的线程对象        
          • value_ptr:指针*value_ptr指向线程返回的参数
          • 返回值:成功 : 0        失败:errno                                                                  
          • int pthread_detach(pthread_t thread); 
          • 功能:让线程结束时自动回收线程资源,让线程和主线程分离
          • 参数:thread:线程ID
        • 4.4获取线程号
          • pthread_t pthread_self(void);
          • 功能:     获取线程号
          • 返回值:     成功:调用此函数线程的ID
        • 4.5练习: 通过线程实现数据的交互,主线程循环从终端输入,线程函数将数据循环输出,当输入quit结束程序。(输入一次,打印一次) 标志位:输入是否完成/输出是否完成
      • 5.线程同步:信号量
        • 5.1linux信号量的分类
          • (1). 内核信号量 由内核控制路径使用,类似于自旋锁
          • (2). Posix信号量   a. 无名信号量:数据存储在内存中,通常在线程间使用或父子进程间 函数接口:sem_init\sem_wait\sem_post   b. 有名信号量:数据存储在文件中,在进程间线程间都可以使用 函数接口:sem_open\sem_wait\sem_post\sem_close
          • (3). System V信号量 是信号量的集合,叫信号灯集,属于IPC对象 函数接口:semget\semctl\semop
        • 5.2无名信号量基础
          • 通过信号量实现线程间同步。
          • 信号量:通过信号量实现同步操作;由信号量来决定线程是继续运行还是阻塞等待。信号量代表某一类资源,其值表示系统中该资源的数量,信号量值>0,表示有资源可以用,可以申请到资源,继续执行程序,信号量值<=0,表示没有资源可以用,无法申请到资源,阻塞。
          • 信号量是一个受保护的变量,只能通过三种操作来访问:初始化sem_init、P操作(申请资源)sem_wait、V操作(释放资源)sem_post。信号量的值为非负整数。
        • 5.3函数接口
          • int sem_init(sem_t *sem, int pshared, unsigned int value)
          • 功能:初始化信号量
          • 参数:
          • sem:初始化的信号量对象    
          • pshared:信号量共享的范围(0: 线程间使用 非0:1进程间使用)    
          • value:信号量初值 返回值:成功 0       失败 -1                                                                                                           
          •  int sem_wait(sem_t *sem)
          • 功能:申请资源 P操作
          • 参数:sem:信号量对象
          • 返回值:成功 0       失败 -1
          • 注:此函数执行过程,当信号量的值大于0时,表示有资源可以用,则继续执行,同时对信号量减1;当信号量的值等于0时,表示没有资源可以使用,函数阻塞。               
          • int sem_post(sem_t *sem)
          • 功能:释放资源 V操作
          • 参数:sem:信号量对象
          • 返回值:成功 0       失败 -1 注:释放一次信号量的值加1,函数不阻塞

相关文章:

I/O进程4

day4 九、信号灯集 1.概念 信号灯(semaphore)&#xff0c;也叫信号量。它是不同进程间或一个给定进程内部不同线程间同步的机制&#xff1b;System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。 通过信号灯集实现共享内存的同步操作。 2.编程…...

【语法】C++的list

目录 为什么会有list&#xff1f; 迭代器失效&#xff1a; list和vector的迭代器不同的地方&#xff1a; list的大部分用法和vector都很像&#xff0c;例如push_back&#xff0c;构造&#xff0c;析构&#xff0c;赋值重载这些就不再废话了&#xff0c;本篇主要讲的是和vecto…...

【算法笔记】并查集详解

&#x1f680; 并查集&#xff08;Union-Find&#xff09;详解&#xff1a;原理、实现与优化 并查集&#xff08;Union-Find&#xff09;是一种非常高效的数据结构&#xff0c;用于处理动态连通性问题&#xff0c;即判断若干个元素是否属于同一个集合&#xff0c;并支持集合合…...

【Ai/Agent】Windows11中安装CrewAI过程中的错误解决记录

CrewAi是什么&#xff0c;可以看之下之前写的 《初识CrewAI多智能代理团队协框架》 (注&#xff1a;这篇是基于linux系统下安装实践的) 基于以下记录解决问题后&#xff0c;可以再回到之前的文章继续进行CrewAI的安装 遇到问题 在windows系统中安装 CrewAi 不管是使用 pip 或者…...

OSPF的数据报文格式【复习篇】

OSPF协议是跨层封装的协议&#xff08;跨四层封装&#xff09;&#xff0c;直接将应用层的数据封装在网络层协议之后&#xff0c;IP协议包中协议号字段对应的数值为89 OSPF的头部信息&#xff1a; 所有的数据共有的信息字段 字段名描述版本当前OSPF进程使用的版本&#xff08;…...

[leetcode]查询区间内的所有素数

一.暴力求解 #include<iostream> #include<vector> using namespace std; vector<int> result; bool isPrime(int i) { if (i < 2) return false; for (int j 2;j * j < i;j) { if (i % j 0) { …...

【力扣刷题实战】Z字形变换

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 力扣题目&#xff1a;Z字形变换 题目描述 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码&#xff08;C&#xff09; 兄弟们共勉 &#xff01;&#xff01;&#xff01; 每篇前言 博客主页&#xff1a;小卡…...

【RK3588 嵌入式图形编程】-SDL2-扫雷游戏-添加地雷到网格

添加地雷到网格 文章目录 添加地雷到网格1、概述2、更新Globals.h3、在随机单元格中放置地雷4、更新单元格以接收地雷5、渲染地雷图像6、开发助手7、完整代码8、总结在本文中,我们将更新游戏以在网格中随机放置地雷,并在单元格被清除时渲染它们。 1、概述 在我们扫雷游戏教程…...

Fortran 中读取 MATLAB 生成的数据文件

在 Fortran 中读取 MATLAB 生成的数据文件&#xff0c;可以通过以下几种方法实现&#xff0c;包括使用开源工具和手动解析&#xff1a; 1. 使用开源工具&#xff1a;MATFOR MATFOR 是一个商业/开源混合工具&#xff08;部分功能免费&#xff09;&#xff0c;提供 Fortran 与 M…...

Kubernetes 入门篇之网络插件 calico 部署与安装

在运行kubeadm init 和 join 命令部署好master和node节点后&#xff0c;kubectl get nodes 看到节点都是NotReady状态&#xff0c;这是因为没有安装CNI网络插件。 kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Not…...

力扣题解:142. 环形链表 II

在链表学习中&#xff0c;我们已经了解了单链表和双链表&#xff0c;两者的最后一个结点都会指向NULL&#xff1b;今天我们介绍的循环列表则不同&#xff0c;其末尾结点指向的这是链表中的一个结点。 循环链表是一种特殊类型的链表&#xff0c;其尾节点的指针指向头节点&#…...

latex模板文件

LaTeX 是一款广泛应用于学术领域的​​文档排版系统​​&#xff0c;尤其以其在数学公式、科学符号和复杂技术文档排版中的强大能力著称。虽然它本身并非专门的“数学软件”&#xff0c;但在处理数学相关内容时表现尤为出色。 1. LaTeX 的核心特点​ 数学公式支持​​&#xff…...

BLE 协议栈事件驱动机制详解

在 BlueNRG-LP 等 BLE 系统中,事件驱动是控制状态转移、数据交互和外设协作的基础。本文将深入讲解 BLE 协议栈中事件的来源、分发流程、处理结构与实际工程实践策略,帮助你构建稳定、可维护的 BLE 系统。 📦 一、BLE 事件的来源分类 BLE 协议栈中的事件严格来自协议栈本身…...

Rust 之四 运算符、标量、元组、数组、字符串、结构体、枚举

概述 Rust 的基本语法对于从事底层 C/C 开发的人来说多少有些难以理解&#xff0c;虽然官方有详细的文档来介绍&#xff0c;不过内容是相当的多&#xff0c;看起来也费劲。本文通过将每个知识点简化为 一个 DEMO 每种特性各用一句话描述的形式来简化学习过程&#xff0c;提高学…...

fuse-python使用fuse来挂载fs

winfsp 安装winfsp,https://winfsp.dev/ fusepy python安装fusepy #!/usr/bin/env python3 import os import stat from fuse import FUSE, FuseOSError, Operationsclass Passthrough(Operations):def __init__(self, root):self.root root# 辅助函数&#xff1a;将挂载点…...

基于ueditor编辑器的功能开发之增加自定义一键排版功能

用户有自己的文章格式&#xff0c;要求复制或者粘贴进来的文章能够一键排版&#xff0c;不需要手动调试 这个需求的话咱们就需要自己去注册一个事件啦&#xff0c;这里我没有修改源码&#xff0c;而是在编辑器初始化之后给他注册了一个事件 我的工具列表变量 vue组件中data中…...

内核态切换到用户态

内核态切换到用户态 是操作系统中 CPU 执行模式的一种切换过程&#xff0c;涉及从高权限的内核态&#xff08;Kernel Mode&#xff09;切换到低权限的用户态&#xff08;User Mode&#xff09;。以下是详细解释&#xff1a; 1. 什么是内核态和用户态&#xff1f; 内核态&#…...

win10离线环境下配置wsl2和vscode远程开发环境

win10离线环境下配置wsl2和vscode远程开发环境 环境文件准备wsl文件准备vscode文件准备 内网环境部署wsl环境部署vscode环境部署 迁移后Ubuntu中的程序无法启动 环境 内网机&#xff1a;win10、wsl1 文件准备 wsl文件准备 在外网机上的wsl安装Ubuntu24.04&#xff0c;直接在…...

AWS弹性容器服务(AWS Elastic Container Service,ECS)概述

李升伟 编译 标签&#xff1a;AWS | ECS | 容器 | Docker AWS弹性容器服务&#xff08;AWS Elastic Container Service&#xff0c;ECS&#xff09;简介 AWS弹性容器服务&#xff08;ECS&#xff09;是一项完全托管的容器编排服务&#xff0c;支持运行、管理和扩展容器化应用…...

Redis过期key处理、内存淘汰策略与缓存一致性策略实践方案

在现代的高性能应用开发中&#xff0c;Redis作为一款极为热门的内存数据库&#xff0c;其快速的读写性能和丰富的数据结构使其在缓存、消息队列等诸多领域得到了广泛应用。然而&#xff0c;在实际使用过程中&#xff0c;处理好Redis过期key、选择合适的内存淘汰策略以及确保缓存…...

@linux系统SSL证书转换(Openssl转换PFX)

在Linux中&#xff0c;你可以使用OpenSSL工具将PFX/P12格式的证书转换为单独的CRT&#xff08;证书&#xff09;、KEY&#xff08;私钥&#xff09;文件以及提取证书链 1. 提取私钥文件(.key) openssl pkcs12 -in your_certificate.pfx -nocerts -out private.key -nodes系统会…...

工业制造各个系统术语

简单总结下 文章目录 MES:制造执行系统ERP:企业资源计划PLM:产品生命周期管理MRP:物资需求计划QMS:质量管理系统APS:高级计划与排程SRM:供应商关系管理SCM:供应链管理CRM:客户关系管理WMS:仓库管理系统TMS:运输管理系统PMS:生产管理系统LES:物流执行系统FICO:财务与成本控制模块…...

深入解析:Python爬取Bilibili视频的技术创新与高阶实践

一、技术背景与挑战 Bilibili&#xff08;B站&#xff09;作为中国最大的泛二次元文化社区&#xff0c;其视频内容防护机制持续升级&#xff0c;传统爬虫技术面临三大核心挑战&#xff1a;动态加密参数、音视频分离存储、反爬策略多样化。本文提出一套融合AIGC辅助分析的智能爬…...

VS Code Markdown渲染配置

VS code markdown preview enhanced插件渲染配置 mac: commandshiftP命令输入Markdown Preview Enhanced: Customize CSS&#xff0c;并点击在打开的style.less配置文件添加一下配置 /* Please visit the URL below for more information: */ /* https://shd101wyy.github.…...

gcc -Wno-cpp

-Wno-cpp 是一个 GCC&#xff08;GNU 编译器&#xff09; 的编译选项&#xff0c;用来控制对 #warning 或 #error 指令中 # 注释的警告显示。 &#x1f31f; 简单解释&#xff1a; 在 C/C 代码中&#xff0c;有时候我们会看到这样的宏定义或注释&#xff1a; #warning This f…...

数据结构篇:线性表的另一表达—链表之单链表(上篇)

目录 1.链表的引入 1.1 链表的概念 1.2 next的意义 2.链表的分类 3.单链表的实现 3.1 单链表实现接口 3.1.1 插入节点函数封装 3.1.2 尾插 3.1.3 头插 3.1.4 报错的根本问题 3.1.5 头删 3.1.6 尾删 4.小结 1.链表的引入 根据顺序表的一些缺陷…...

SpringBoot企业级开发之【用户模块-获取用户详细信息】

接口文档的要求&#xff1a; 了解一下token令牌头是怎么用的 我们直接放到前端交互的controller类下&#xff0c;在声明的方法中加入参数为String token且加入注解RequestHeader(name"Authorization【你自己设定的token】") 设计思路: 实战开发&#xff1a; control…...

Mockito如何对静态方法进行测试

在 Mockito 中,直接对静态方法进行模拟是困难的,因为 Mockito 的设计理念是优先通过依赖注入(DI)管理对象,而静态方法破坏了这种设计(难以解耦)。不过,从 Mockito 3.4.0 版本开始,通过 mockStatic 方法支持了对静态方法的模拟(需配合 mockito-inline 依赖)。 从 Mo…...

患者根据医生编号完成绑定和解绑接口

医疗系统接口文档 一、Controller 层 1. InstitutionDoctorController 医疗机构和医生相关的控制器&#xff0c;提供机构查询、医生查询、绑定解绑医生等功能。 RestController RequestMapping("/institution-doctor") public class InstitutionDoctorController…...

Navicat 17 for Mac 数据库管理

Navicat 17 for Mac 数据库管理 一、介绍 Navicat Premium 17 for Mac是一款专业的数据库管理工具&#xff0c;适用于开发人员、数据库管理员和分析师等用户。它提供了强大的数据管理功能和丰富的工具&#xff0c;使用户能够轻松地管理和维护数据库&#xff0c;提高数据处理效…...