Liunx系统编程(纯理论分享一)

一、IO

1. IO的种类

标准IO:库函数
文件IO:系统调用

2. 库函数和系统调用

系统调用:系统调用是从用户空间进入内核空间的唯一方法,它的可移植性差、没有缓冲区,所以效率低。
库函数:库函数=系统调用+缓冲区,它的可移植性比较强、有缓冲区,所以效率高。

3. 标准IO和文件IO的区别

(1)缓冲机制
标准IO具有缓冲机制,自动处理数据的缓冲和刷新,提高IO效率;
文件IO无缓冲机制,需开发者自行处理数据的读写。
(2)函数来源
标准IO的函数接口了来自于C语言的标准库,与操作系统无关,因此具有良好的移植性;
文件IO的函数接口来自Liunx内核,与操作系统紧密相关,移植性差。
(3)操作入口
标准IO操作文件的入口是文件流,通过文件流来进行数据的读写;
文件IO操作文件的入口是文件描述符(fd),通过文件描述符来访问文件。
(4)应用场景
标准IO适用于对文本文件的读写操作,提供了丰富的文件接口和缓冲机制,方便开发者进行文件操作(按字符读取、按行读取等等十几个函数)。
文件IO适用于读二进制文件进行读取,以及对底层设备的访问,如网络套接字、硬件设备等等。
还用于实时性高的场景,如传感器数据的读写。

4. 标准IO缓冲区问题

(1)缓冲区的种类

行缓存:与终端相关的缓冲区(stdin、stdout)
全缓存:与文件相关的缓冲区(fp)
无缓存:标准出错没有缓冲区(stderr)

(2)缓冲区大小

行缓存:1k
全缓存:4k
无缓存:0

(3)缓冲区的刷新方式

行缓存
(1)遇到换行符时
(2)调用fclose()
(3)程序结束时
(4)输入输出切换时
(5)当行缓冲区满时
(6)用fflush()刷新缓冲区
全缓存
(1)调用fclose()
(2)程序结束时
(3)输入输出切换时
(4)当行缓冲区满时
(5)用fflush()刷新缓冲区

5. 目录

遍历目录
用opendir打开目录,然后循环调用readdir直到readdir返回NULL
判断每个文件的类型,如果是目录文件,就递归调用当前函数本身来遍历这个目录
如果是普通文件,则输出

二、文件映射虚拟内存

1. 简介

文件映射虚拟内存,是把文件映射到内存中,用操作内存的方式来操作文件,能高效实现文件 I/O 和进程间共享数据。
如果是比较大的文件,可以提高效率。
硬盘操作相对于文件操作,效率低下很多。

2. 编程模型

三、进程

1. 简介

progress 进程是操作系统资源分配的基本单位,是一个独立运行的程序实例。每个进程拥有独立的内存空间、文件描述符、寄存器状态等系统资源,相当于一个 “独立的程序运行环境”。
线程,是进程内的一个执行单元,是操作系统调度的基本单位(CPU 调度的最小单位)。线程共享所属进程的全部资源(如内存空间、文件句柄),但拥有自己的程序计数器、栈和寄存器状态。

2. 进程的状态

R 运行时状态 S 睡眠状态 T 挂起状态 D 死亡状态 Z僵尸状态

3. 如何创建一个进程

(1)执行程序创建
可执行程序 a.out
(2)exec簇
(3)fork

4. 进程间的通信

进程间的通信,就是不同进程之间传递数据、交换信息或协同工作的机制。由于进程拥有独立的地址空间,无法直接访问彼此的内存,因此需要专门的IPC机制来实现数据交换。
常见的进程间通信方式如下:
(1)管道
(2)命名管道
(3)信号
(4)共享内存
(5)消息队列
(6)信号量
(7)套接字

四、管道

1. 简介

是一种用于进程间通信的机制,它允许一个进程的输出作为另一个进程的输入,实现数据的单向传递。
管道是半双工的,数据只能从一端流入、另一端流出(通常分为「读端」和「写端」)。
管道传输的都是字符串,如果是其他数据,会转成字符串再进行传输;要注意数据的边界以及格式

2. 分类

匿名管道
直接就是打开的文件描述符,能且只能在父子进程之间通信。
通过pipe()系统调用创建,没有文件名,仅在进程生命周期内存在,进程退出后自动销毁。
有名管道
通过mkfifo()系统调用创建,有一个可见的文件名存于文件系统中;
可用于无亲缘关系的进程通信,只要知道管道的路径即可访问;
本质是特殊的文件,遵循先进先出原则。

五、信号

1. 简介

是一种用于进程间异步通信的机制,用于通知进程发生了某种事件(如错误、外部中断、用户请求等),促使进程执行预先定义的处理动作。
信号可以理解为操作系统向进程发送的「通知」,它具有异步性(进程无需主动等待,信号可随时到来)和简洁性(主要传递事件类型,不携带复杂数据)。

2. 产生信号

  • 按键产生,如:ctrl+c(2 终止/中断)、ctrl+z(20 暂停)、ctrl+\(3 退出)
  • 系统(函数)调用产生,如:kill、raise、abort
  • 软件条件产生,如:定时器alarm
  • 硬件异常产生,如:非法访问内存(段错误)、除0(浮点数例外)、内存对齐出错(总线错误)
  • 命令产生,如:kill命令(给指定进程发送指定信号,不一定是杀死)

3. 信号的处理方式

  • 执行默认处理动作(每一个信号都有自己的默认处理动作)
  • 忽略(丢弃)
  • 捕捉(自定义处理函数)

六、IPC

1. 简介

指多个进程之间传递数据或信号的机制。在多任务操作系统中,进程是资源分配的基本单位,各个进程相对独立,为了协同工作,就需要进程间通信。
IPC有三种:shm--共享内存、msg--消息队列、sem--信号量
基于key,ftok()创建key,区分IPC

2. IPC相关命令

ipcs:查看所有的IC
ipcrm -m:删除共享内存
ipcrm -q:删除消息队列
ipcrm -s:删除信号量

3. 共享内存

创建一块内存段,这块内存段可以让多个进程挂载上去;
挂载上去的进程可以访问这块内存段(读访问、写访问);
共享内存没有先后顺序,然后也无法区分数据来自于哪一个进程;
内存段大小可以指定,访问方式可以限制;
key唯一,通过key来生成的共享内存段唯一。

4. 消息队列

消息队列是创建了一个主机上多个进程都可以访问的队列,实现不同进程间的异步通信
队列里可以存放多个消息;
消息有数据和类型;
消息的数据长度自行指定;
消息的类型是一个unsigned long。

5. 信号量

信号量本质是个整数。
多个进程都可以对这个整数进行操作(加减)
减法操作比较特殊:如果减到0以下,就会阻塞,直到减法的结果不是0以下为止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值