I/O进程3

  • day3
    • 五、进程
      • 7.函数接口
        • 7.1创建子进程
          • pid_t fork(void);
          • 功能:创建子进程
          • 返回值:成功:在父进程中:返回子进程的进程号 >0  在子进程中:返回值为0;  失败:-1并设置errno
          • 特点
            • 1.子进程几乎拷贝了父进程的所有内容,包括代码、数据,缓冲区,系统数据段中的值,栈中的数据,父进程打开的文件,但是PID,PPID不同
            • 2.fork之前的代码会被复制但是不会被重新执行,fork之后的代码会被复制,并且父子进程分别执行一遍。
            • 3.父子进程的空间相互独立,互不影响,当在相应的进程中改变全局变量,静态变量,都互不影响
            • 4.fork之前打开的文件,fork之后拿到的是同一个文件描述符,操作的是同一个文件指针
            • 5.若父进程先结束,子进程成为孤儿进程,被init进程所收养,会变成后台进程。
            • 6.若子进程先结束,父进程不结束,父进程没有及时回收,子进程就会变成僵尸进程(避免僵尸进程的产生)
      • 8.回收进程
        • pid_t wait(int *status);
        • 功能:回收子进程资源(阻塞)
        • 参数:status:子进程退出状态,不接受子进程状态设为NULL
        • 返回值:成功:回收的子进程的进程号       失败:-1                                                                          
        • pid_t waitpid(pid_t pid, int *status, int options);
        • 功能:回收子进程资源
        • 参数:
        • pid:>0 指定子进程进程号        =-1 任意子进程        =0 等待其组ID等于调用进程的组ID的任一子进程          <-1 等待其组ID等于pid的绝对值的任一子进程    
        • status:子进程退出状态    
        • options:0:阻塞          WNOHANG:非阻塞
        • 返回值:正常:结束的子进程的进程号      当使用选项WNOHANG且没有子进程结束时:0       出错:-1
      • 9.结束进程
        • void exit(int status);
        • 功能:结束进程,刷新缓存
        • 参数:退出的状态 不返回。
      • 10.获取进程号
        • pid_t getpid(void);
        • 功能:获取当前进程的进程号
        • pid_t getppid(void);
        • 功能:获取当前进程的父进程号
    • 六、进程间通信
      • 1.为什么要进行进程间通信
        • 数据传输、资源共享、事件通知、进程控制
      • 2.进程间通信方式(7)
        • (1).早期进程间通信 无名管道(pipe)、有名管道(fifo)、信号(sem)
        • (2).system V IPC通信 共享内存(share memory)、消息队列(message queue)、信号灯集(semaphore)
        • (3).BSD: 套接字(socket)
      • 3.无名管道
        • 3.1原理图
          • 通信原理:一个进程的输出可以当作另一进程的输入
        • 3.2特点
          • (1).只能用于具有亲缘关系的进程间通信
          • (2).半双工通信模式,具有固定的读端和写端 {单工:只能单方向通信, 广播 半双工:可以双向通信,但是同一时间不可以 对讲机 全双工:可以双向同时通信 打电话}
          • (3).无名管道可以被看做一个特殊的文件,对于他的读写可以使用文件IO函数 (注意:不是文件,他只是存在于内核空间的一部分,无实际文件)
          • (4).管道基于文件描述符进行通信。当一个管道建立的时候,它会自动创建两个文件描述符,一个用于读fd[0],一个用于写fd[1]。
        • 3.3函数
          • int pipe(int fd[2])
          • 功能:创建无名管道
          • 参数:文件描述符 fd[0]:读端 fd[1]:写端
          • 返回值:成功 0       失败 -1
      • 4.有名管道(FIFO)
        • 4.1特点
          • (1).可以使互不相干的两个进程通信
          • (2).有名管道可以通过路径名来指出,并在文件系统中可见,但是内容存储在内存中
          • (3).进程通过文件IO操作有名管道
          • (4).有名管道遵循先进先出的原则,不支持lseek()操作
          • (5).半双工通信
        • 4.2函数
          • int mkfifo(const char *filename,mode_t mode);
          • 功能:创建有名管道
          • 参数:filename:有名管道文件名        mode:权限
          • 返回值:成功:0        失败:-1,并设置errno号
    • 七、信号
      • 1.例子
        • kill -l:查看系统中信号
        • kill -num pid:给pid进程发送pid信号
      • 2.概念
        • (1).信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。 (2).信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。 (3).如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。
      • 3.信号响应方式
        • (1.)忽略信号:对信号不做任何处理,但是有两个信号不能做忽略处理:SIGKILL和SIGSTOP
        • (2).捕捉信号:定义信号处理函数,当信号发生的时候,执行相应的处理函数,但是有两个信号不能做捕捉处理:SIGKILL和SIGSTOP
        • (3).执行缺省操作:linux对每种信号都规定了默认信号。
      • 4.信号的种类
        • 2)SIGINT:结束进程,对应快捷方式ctrl+c
        • 3)SIGQUIT:退出信号,对应快捷方式ctrl+\
        • 9)SIGKILL:结束进程,不能被忽略不能被捕捉
        • 14)SIGALRM:闹钟信号,alarm函数设置定时,当到设定的时间时,内核会向进程发送此信号结束进程。
        • 15)SIGTERM:结束终端进程,kill 使用时不加数字默认是此信号
        • 17)SIGCHLD:子进程状态改变时给父进程发的信号
        • 19)SIGSTOP:暂停进程,不能被忽略不能被捕捉
        • 20)SIGTSTP:暂停信号,对应快捷方式ctrl+z
        • 信号的种类
        • 在Linux中,信号被分为不可靠信号和可靠信号,一共64种,可以通过kill -l命令来查看
        • ●不可靠信号:也称为非实时信号,不支持排队,信号可能会丢失,比如发送多次相同的信号,进程只能收到一次,信号值取值区间为1~31
        • ●可靠信号:也称为实时信号,支持排队,信号不会丢失,发多少次,就可以收到多少次,信号值取值区间为32~64 信号产生的方式有如下几种:
        • ● 对于前台进程,用户可以输入特殊终端字符来发送,比如输入Ctrl+C
        • ● 系统异常,比如浮点异常和非法内存段访问
        • ● 系统状态变化,比如alarm定时器到期时将引起SIGALRM信号
        • ● 在终端运行kill命令或在程序中调用kill函数
      • 5.函数接口
        • 5.1发送信号
          • int kill(pid_t pid, int sig);
          • 功能:信号发送
          • 参数:pid:指定进程           sig:要发送的信号
          • 返回值:成功 0              失败 -1     
          •                                              
          •  int raise(int sig);
          • 功能:进程向自己发送信号
          • 参数:sig:信号
          • 返回值:成功 0              
          • 失败 -1                                                 
          •   int pause(void);
          • 功能:用于将调用进程挂起,直到收到信号为止。 
        • 5.2定时器
          • unsigned int alarm(unsigned int seconds)
          • 功能:在进程中设置一个定时器
          • 参数:seconds:定时时间,单位为秒
          • 返回值:如果调用此alarm()前,进程中已经设置了闹钟时间,则 返回上一个闹钟时间的剩余时间,否则返回0。
          • 注意:一个进程只能有一个闹钟时间。如果在调用alarm时 已设置过闹钟时间,则之前的闹钟时间被新值所代替
        • 5.3信号处理
          • #include <signal.h>
          • typedef void (*sighandler_t)(int);
          • sighandler_t signal(int signum, sighandler_t handler);
          • 功能:信号处理函数
          • 参数:
          • signum:要处理的信号          
          • handler:信号处理方式              
          • SIG_IGN:忽略信号              
          • SIG_DFL:执行默认操作              
          • handler:捕捉信号 void handler(int sig){} //函数名可以自定义
          • 返回值:成功:设置之前的信号处理方式              失败:-1
    • 八、共享内存
      • 1.特点
        • (1).共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,不需要进行任何数据的拷贝
        • (2).为了在多个进程间进行数据的交互,内核专门留了一块内存区,可以由需要访问的进程将其映射到自己的地址空间
        • (3).由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等
      • 2.编程步骤
        • (1).创建或者打开共享内存shmget
        • (2).映射共享内存到自己的用户空间shmat
        • (3).使用共享内存
        • (4).撤销映射
        • (5).删除共享内存
      • 3.函数接口
        • int shmget(key_t key, size_t size, int shmflg);
        • 功能:创建或打开共享内存
        • 参数:     key 键值     size 共享内存的大小     shmflg IPC_CREAT|IPC_EXCL(判错)|0666
        • 返回值:成功 shmid              出错 -1
        • void *shmat(int shmid,const void *shmaddr,int shmflg);
        • 功能:映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问
        • 参数:    
        • shmid 共享内存的id号    
        • shmaddr 一般为NULL,表示由系统自动完成映射,如果不为NULL,那么由用户指定    
        • shmflg:SHM_RDONLY就是对该共享内存只进行读操作  ,0 可读可写
        • 返回值:成功:完成映射后的地址,       失败:-1的地址
        • 用法:if((p = (char *)shmat(shmid,NULL,0)) == (char *)-1)                 
        •  int shmdt(const void *shmaddr);
        • 功能:取消映射
        • 参数:要取消的地址
        • 返回值:成功0       失败的-1                                                                                             
        • int shmctl(int shmid,int cmd,struct shmid_ds *buf);
        • 功能:(删除共享内存),对共享内存进行各种操作
        • 参数:    
        • shmid 共享内存的id号    
        • cmd IPC_STAT 获得shmid属性信息,存放在第三参数            
        • IPC_SET 设置shmid属性信息,要设置的属性放在第三参数            
        • IPC_RMID:删除共享内存,此时第三个参数为NULL即可
        • 返回:成功0      失败-1
        • 用法:shmctl(shmid,IPC_RMID,NULL);
      • 4.命令
        • ipcs -m:查看系统中共享内存
        • ipcrm -m shmid :删除共享内存

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

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

相关文章

k8s 1.24.17版本部署(使用Flannel插件)

1.k8s集群环境准备 推荐阅读: https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ 1.1 环境准备 环境准备:硬件配置: 2core 4GB磁盘: 50GB操作系统: Ubuntu 22.04.04 LTSIP和主机名:10.0.0.231 master23110.0.0.232 worker23210.0…

网络编程—TCP/IP模型(UDP协议与自定义协议)

上篇文章&#xff1a; 网络编程—Socket套接字&#xff08;TCP&#xff09;https://blog.csdn.net/sniper_fandc/article/details/146923783?fromshareblogdetail&sharetypeblogdetail&sharerId146923783&sharereferPC&sharesourcesniper_fandc&sharefro…

GNSS有源天线和无源天线

区别 需要外部供电的就是有源天线&#xff0c;不需要外部供电的是无源天线。 无源天线 一般就是一个陶瓷片、金属片等&#xff0c;结构简单&#xff0c;成本低廉&#xff0c;占用空间及体积小&#xff0c;适合于强调紧凑型空间的导航类产品。 不需要供电&#xff0c;跟设备直…

网络编程—TCP/IP模型(IP协议)

上篇文章&#xff1a; 网络编程—TCP/IP模型&#xff08;TCP协议&#xff09;https://blog.csdn.net/sniper_fandc/article/details/147011479?fromshareblogdetail&sharetypeblogdetail&sharerId147011479&sharereferPC&sharesourcesniper_fandc&sharef…

基于金字塔视觉变换的类引导网络高分辨率遥感图像高效语义分割

Class-Guidance Network Based on the Pyramid Vision Transformer for Efficient Semantic Segmentation of High-Resolution Remote Sensing Images 摘要 多分类语义分割中类之间的小差异和类内的大变化是全卷积神经网络的“编码器-解码器”结构没有完全解决的问题&#…

基于人工智能的高中教育评价体系重构研究

基于人工智能的高中教育评价体系重构研究 一、引言 1.1 研究背景 在科技飞速发展的当下&#xff0c;人工智能技术已广泛渗透至各个领域&#xff0c;教育领域亦不例外。人工智能凭借其强大的数据处理能力、智能分析能力和个性化服务能力&#xff0c;为教育评价体系的创新与发…

DeepSeek在互联网技术中的革命性应用:从算法优化到系统架构

引言:AI技术重塑互联网格局 在当今快速发展的互联网时代,人工智能技术正以前所未有的速度改变着我们的数字生活。DeepSeek作为前沿的AI技术代表,正在多个互联网技术领域展现出强大的应用潜力。本文将深入探讨DeepSeek在搜索引擎优化、推荐系统、自然语言处理以及分布式系统…

数字游戏(继Day 10)

主体: #include<stdio.h> #include<time.h> #include<stdlib.h>#include"mygetch.h"#define MAX 51 //定义测试字母的最大长度void help() {printf("\n****************************************");printf("\n*输入过程中无法退出…

谈谈模板方法模式,模板方法模式的应用场景是什么?

一、模式核心理解 模板方法模式是一种​​行为设计模式​​&#xff0c;通过定义算法骨架并允许子类重写特定步骤来实现代码复用。 如同建筑图纸规定房屋结构&#xff0c;具体装修由业主决定&#xff0c;该模式适用于​​固定流程中需要灵活扩展​​的场景。 // 基础请求处理…

2024 Jiangsu Collegiate Programming Contest H

记录一下为数不多的网络流 #pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc.h> #include <execution> using namespace std; using i64 long long; using i128 __int128;template <typename T>struct MCFgraph{struct …

Hadoop序列化与反序列化

一、Hadoop序列化概述 &#xff08;一&#xff09;什么是序列化和反序列化 序列化&#xff1a;序列化是将对象&#xff08;如Java中的类实例&#xff09;转换为字节序列的过程。在Hadoop中&#xff0c;数据在分布式系统中传输或者存储到磁盘时&#xff0c;需要将数据对象序列…

FreeRTOS临界区

在FreeRTOS中&#xff0c;临界区通过关闭可管理的中断来保护共享资源&#xff0c;具体关闭的中断层级由configMAX_SYSCALL_INTERRUPT_PRIORITY宏定义决定。以下是关键点解析&#xff1a; 中断优先级分类&#xff1a; 高优先级中断&#xff1a;数值低于configMAX_SYSCALL_INTERR…

cdw2: TypeScript

一、javascript的问题 二、初识typescript https://mp.weixin.qq.com/s/wnL1l-ERjTDykWM76l4Ajw 三、类型 二进制&#xff1a;ob开头&#xff0c;八进制&#xff1a;0o开头&#xff0c;十六进制&#xff1a;0x开头 开发中不这样写 这样写 匿名函数的参数最好不要…

Qt中的元对象系统

Qt的元对象系统(Meta-Object System)提供了对象间通信的信号和槽机制、运行时类型信息和动态属性系统。 元对象系统基于以下三个方面&#xff1a; (1).QObject类&#xff1a;为可以利用元对象系统的对象提供了基类。 (2).Q_OBJECT宏&#xff1a;用于启用元对象功能&#xff0c;…

深入理解重排(Reflow)与重绘(Repaint),写出高性能 CSS 动画

在前端开发中&#xff0c;CSS 动画是提升用户体验的重要手段&#xff0c;但很多开发者在使用动画时并不了解浏览器背后的渲染机制&#xff0c;导致动画卡顿甚至影响整体性能。本文将带你深入理解 CSS 中的两大核心概念 —— 重排&#xff08;Reflow&#xff09; 与 重绘&#x…

<贪心算法>

前言&#xff1a;在主包还没有接触算法的时候&#xff0c;就常听人提起“贪心”&#xff0c;当时是layman&#xff0c;根本不知道说的是什么&#xff0c;以为很难呢&#xff0c;但去了解一下&#xff0c;发现也不过如此嘛&#xff08;bushi)&#xff0c;还以为是什么高级东西呢…

大模型快速 ASGI 服务器uvicorn

基础概念类 1. 什么是 Uvicorn&#xff0c;它的作用是什么&#xff1f; 答案&#xff1a;Uvicorn 是一个基于 Python 的快速 ASGI&#xff08;异步服务器网关接口&#xff09;服务器。它的主要作用是作为 Web 应用程序的服务器&#xff0c;负责接收客户端的请求&#xff0c;并…

2025高频面试算法总结篇【二叉树】

文章目录 直接刷题链接直达非递归实现求二叉树的深度非递归从左至右打印一颗二叉树中的所有路径判断平衡二叉树二叉搜索树中第K小的元素二叉树的完全性检验根据前&中序遍历结果重建二叉树二叉树的最近公共祖先二叉树的直径二叉树的遍历 直接刷题链接直达 非递归实现求二叉…

redis 和 MongoDB都可以存储键值对,并且值可以是复杂json,用完整例子分别展示说明两者在存储json键值对上的使用对比

Redis 存储 JSON 键值对示例 存储操作&#xff1a; // 存储用户信息&#xff08;键&#xff1a;user:1001&#xff0c;值&#xff1a;JSON对象&#xff09; SET user:1001 {"name":"Alice", "age":30, "address":"New York&quo…

介绍几种创意登录页(含完整源码)

今天为大家收集了几种不同风格的登录页&#xff0c;搭配动态渐变背景&#xff0c;效果绝对惊艳&#xff01; CSS3实现动态渐变玻璃拟态登录页 一、开篇语 纯CSS实现当下最火的玻璃拟态(Morphism)风格登录页&#xff0c;搭配动态渐变背景&#xff0c;效果绝对惊艳&#xff01; …