在学习Linux系统课程总结了笔记并汾享出来。有问题请及时联系博主:转载请注明出处。
1、熟练使用pipe进行父子进程间通信
2、熟练使用pipe进行兄弟进程间通信
3、熟练使用fifo进行無血缘关系的进程间通信
4、熟练掌握mmap函数的使用
5、掌握mmap创建匿名映射区的方法
6、使用mmap进行有血缘关系的进程间通信
7、使用mmap进行无血缘关系嘚进程间通信
》IPC方法:进程间通信通过内核提供的缓冲区进行数据交换的机制。
Linux环境下进程地址空间相互独立,每个进程各自有不同嘚用户地址空间任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问要交换数据必须通过内核,在內核中开辟一块缓冲区进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)
在进程间完成数据传递需要借助操作系统提供特殊的方法,如:文件、管道、信号、共享内存、消息队列、套接字、命名管道等随着计算机的蓬勃发展,一些方法由于自身设计缺陷被淘汰或者弃用现今常用的进程间通信方式有:
2)fifo 信号 (开销最小)3)mmap 共享映射区 (无血缘关系) 速度最快4)本地socket 本地套接字 (最稳定)
5)信号(携带信息量最小)
管道是一种最基本的IPC机制,作用于有血缘关系的进程之间完成数據传递。调用pipe系统函数即可创建一个管道有如下特质:
1. 其本质是一个伪文件(实为内核缓冲区)
2. 由两个文件描述符引用,一个表示读端一個表示写端。
3. 规定数据从管道的写端流入管道从读端流出。
管道的原理: 管道实为内核使用环形队列机制借助内核缓冲区(4k)实现。
管道的局限性:① 数据一旦被读走便不在管道中存在,不可反复读取
②由于管道采用半双工通信方式。因此数据只能在一个方向上流动。
③ 只能在有公共祖先的进程间使用管道
常见的通信方式有,单工通信、半双工通信、全双工通信
pipefd读写文件描述符,0代表读1代表寫
返回值:失败返回-1,成功返回0
3、父子进程实现ps、grep命令
4、ps、grep命令实现问题解决
代码的问题:父進程认为还有写端存在,就有可能还有人给发数据继续等待。
写端全部关闭——read读到0,相当於读到文件末尾
有数据——read 读到数据
没有数据——read 阻塞 fcntl 函数可以更改非阻塞
读端全部关闭——?产生一个信号SIGPIPE程序异常终止
管道已满——write阻塞。如果要显示现象读端一直不读,写端狂写
管道未满——write正常写入
缺点:1)只能有血缘关系的进程通信;2)父子进程单方向通信,如果需要双向通信需要创建多根管道。
7、fifo实现通信写端
8、fifo使用注意事项
在学习Linux系统课程總结了笔记并分享出来。有问题请及时联系博主:转载请注明出处。