一、基本知识
1、管道,是特殊的文件(基于内核(内存)上创建);以前的文件是在硬盘上创建。
2、工作方向
单工:数据方向单一,广播
半双工:同一时刻只能有一个方向,对讲机
全双工:同一时刻两个方向都可以通信,电话
3、无名管道,只能用于亲缘关系 进程间
A.c B.c
| |
A B
有名管道(没有关系的进程间)
fifo(管道)先进先出
有名管道这种类型,大小为0,如果用vi 打开的化相当于是打开了一个管道。
a、是一种特殊文件
1、存在与内存中
2、在系统中 有一个对应名称(被当作文件来看)
3、看文件大小0bytes(他并不是用来保存数据的,就是一个管道,要有流动)
b、
A.c B.c
| |
A B
二、编程
mkfifo()创建有名管道
第一个是指定管道的名字
mode 创建的权限
返回值
成功0
失败 -1
EEXIST pathname already exists. This includes the case where pathname is a symbolic link, dangling or not
因为有时候会创建的时候输入同名,但是如果判断加他是否重名,他就会出错退出,无法继续运行,在此,我们的目的就是未来,计算重名,我们也可以继续正常运行下去。他并不是创建失败了。
在这里管道,要求双方另一端,以相对的方式打开
用remove来删除管道
总结
1、有名管道 特殊文件,但是在系统中有一个名字
2、有名管道 可以用于 任意进程间通信
3、有名通道 操作符号 前面管道操作特点
4、管道中数据 遵循fifo 的读写规则
5、管道文件都不支持定位操作 lseek fseek
三、信号
本身并不能传递大量数据
信号是一种异步的通信方式
异步:
同步:
1、说明对象一定是两个
2、接收信号的时间不一定(异步),不是说一发就能收
2、如果步调一致-----同步
不管步调不一致 ------ 异步
中断
信号也称为软中断(在软件层面上 ----- 实现一个类似中断过程)
四、编程操作
1、signal(a)
功能:
信号处理函数的注册函数(安装)函
对某一各函数设置对某个信号进行处理的函数 注册
也就是说看谁要对这个信号处理,我们就在者部署即可,表示我们要对这个信号进行处理。
参数
signum 要处理的信号的编号
//注意:不能被阻塞,处理和忽略 SIGKILL STGSTOP
handler 要对这个信号做怎么的处理 ----handler是一个函数指针,指向信号处理函数
返回值(函数指针)(函数入口地址)
成功,表示上一次设置的 信号处理函数的入口地址(也就是说是在第一次设置一个信号处理,第二次有设置另一种的信号处理,最后在第二次运行完,返回的是第一次的入口地址)
失败 返回SIG_ERR
handler 这个参数可以设置为SIG_igN,忽略这个信号
handler 这个设置SIG_DFL,默认操作
2、自己设置一个函数,这个函数,可以做想做的事情,进程不被结束。
进程的状态都是结束,也就是说遇到这个就结束了
SIGKILL 和 SIGSTOP 不能被忽略,被阻塞,这个是重点,需要记忆
SIGCHLD
相当于是自己对在终端上发射的信号进行处理,来模拟对这个信号的一个软件中断(就是将这个信号捕捉到,并对他做出反应,但是其中有操作是没有用)
如果要想让其在一个信号处理函数实现不同的功能,只需要用if语句在里面进行判断一下
3、kill()功能一样函数
功能:通过该函数可以给pid进程发送信号
SIGNAL,不管子进程正常结束还是异常结束,都能发射信号,进行接收