进程间通信:讲的是操作系统为用户提供的几种进程间的通信方式
概念:进程间通信其实就是多个进程之间进行数据交互
问题:进程间通信为什么不能直接进行数据交互,需要使用系统提供的方式?
原因:进程之间是具有独立性的,每个进程都有自己的虚拟地址空间,访问数据的时候都是通过自己的虚拟地址进行访问的,一个进程将自己的某个变量的空间地址(虚拟地址)交给另一个进程,另一个进程是无法访问的(例如,把两个人放在两个真空空间,这时候两个人说话对方听不到,无法形成实质性通信)
操作系统提供进程间通信方式,实际上就是给多个进程之间提供一个空间的交叉点,让多个进程都可访问到,形成通信
1.管道
生活资源一般也都是管道传输:自来水管道等
管道的特性:半双工通信
管道的本质:操作系统给进程之间提供进程间通信的方式,本质其实都是提供了一个空间的交叉点,都能访问,在我们程序中,管道其实是内核中的一块缓冲区(就是一块内存,多个进程通过访问同一块缓冲区来实现数据传输)
管道分类
管道本质是内核中的一块缓冲区,但是Linux操作系统中,一切皆文件,将管道当作文件处理
匿名管道没有标识符,无法被其他进程找到,所以无法进行通信,这时候只能通过创建子进程的方式进行,子进程复制了父进程,也就复制了父进程所拥有的操作语柄,通过语柄可以访问到这个管道
2.文件的操作
以文本的形式打开文件,可能会造成读到的文数据与文件实际的数据有差别
因此,要对文件的实际数据进行处理,则一定要使用b来打开,如下:
3.接口介绍
库函数是对系统调用接口的封装
接口:open write read lseek close
open
write
read
lseek
close
因为系统调用接口功能比较单一,在某些特定场景下比较麻烦,所以,库函数是对系统调用接口的封装,printf将数据写入显示器文件,不单单是写入,还包含数据的格式化
4.文件流与文件描述符
向文件写入数据,数据不会立即被写入文件,而是先写入缓冲区,等待缓冲区刷新的时候写入文件,但对于系统调用接口来说本质上没有这个缓冲区,因此write向显示器写入数据是直接打印的,而printf,fprintf, fwrite是刷新缓冲区时才打印
文件描述符:被打开的文件的操作语柄--一个非负整数
5.重定向
6.动态库和静态库
静态库与动态库
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间
生成库
使用库