0805|IO进程线程day8 IPC机制(进程间通信机制)管道+信号

本文介绍了Linux系统中IPC(进程间通信)机制,包括管道和信号。管道分为无名管道和有名管道,阐述了其原理、特性及操作方法,并给出相关代码示例。信号部分介绍了概念、处理方式、常见信号及相关函数,如signal、kill、alarm等,还说明了用信号回收僵尸进程的方法。

一、什么是IPC机制

概念:        

        IPC机制:Inter Process Communication,即进程间通信机制

        进程与进程间的用户空间相互独立,内核空间共享。所以如果要实现进程间的通信,需要使用进程间通信机制。

分类(3类):

  1. 传统的进程间通信机制
        无名管道  pipe
        有名管道  fifo
        信号      signal
  2. system v操作系统的IPC对象
        消息队列  message queue
        共享内存  shared memory
        信号灯集  semaphore
  3. 可用于跨主机传输的通信
        套接字  socket

二、管道

2.1 管道的原理

        在进程的3~4G内核空间中,创建一个管道(特殊的文件),管道中的数据是直接存储在内存中的。

2.2 管道的特性

1) 管道可以看成是一个特殊的文件一般的文件存放在磁盘上,而管道中的内容存储在内存中

2) 管道遵循先进先出的原则。(队列形式实现);

3) 管道的大小64K = 64*1024 = 65536bytes ;

4) 对于管道的读操作是一次性,如果对管道进行读操作,那么被读取的数据会从管道中删除 ;

5) 管道是一种半双工的通信方式 :

单工:只能A发消息给B,B无法发消息给A;
半双工:同一时间,只能A发消息给B,或者B发消息给A;
全双工:同一时间,可以双方通信。

6) 当管道的读写端均被关闭的时候,此时会释放管道在内核内存中的空间 ;

7) 从管道中读取数据

         · 当管道的读写端均存在
           ① 管道中没有数据的时候读函数阻塞
           ② 管道中实际拥有的个数a(10个),大于要读取的数据个数b(5个),则实际读取b(5个);
           ③ 若管道中有5个数据,读取10个,实际读5个
         · 当管道的写端不存在(父子进程的写端均关闭)
           ① 此时去读取数据,若管道中原来存在数据,则先将数据读取完毕,
           ② 若没有数据了,read函数不阻塞,且read函数立即返回0;

8) 向管道中写入数据

         · 当管道的读写端均存在
           ① 管道写满后write函数会阻塞。

        · 当管道的写端不存在(父子进程的写端均关闭)
           ① 此时只要尝试向管道中写入数据(只要调用了write函数),调用write函数的进程会收到一个管道破裂信号,该信号会导致当前进程退出
           ② 管道破裂信号:SIGPIPE

2.3 无名管道(pipe)

1) 无名管道的特点

  1. 无名管道:顾名思义即没有名字的管道文件,在用户空间不可见的管道文件
  2. 无名管道只能用于具有亲缘关系的进程间通信
  3. 由于无名管道存在于内核空间中,所以我们需要直接对内核进行操作,此时只能使用系统调用函数,即只能使用文件IO函数,例如:open read write close 。 但是不能使用lseek函数。

无名管道只能用于具有亲缘关系的进程间通信,为什么?

  1. 无名管道在文件系统中不可见,所以无亲缘关系的进程无法拿到同一根管道的读写端。
  2. 子进程会克隆父进程的文件描述符表,所以可以在父进程中创建一根管道,然后fork一份资源给子进程,此时子进程可以拿到与父进程相同的文件描述符表。即可以拿到同一根无名管道的读写端。

2) pipe

功能:创建一个无名管道,同时打开无名管道的读写端;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值