无名管道:只能用于亲缘关系进程之间的通信
有名管道:1、存在于内存中
2、在系统中有一个对应名称
3、文件大小 0bytes
FIFO文件被打开,就可以使用与操作匿名管道和其它文件的系统调用一样的I/O系统调用,如使用 read()读数据
,write()写数据
,close()关闭FIFO
等。
与匿名管道一样,FIFO也有一个写入端和读取端,且从管道中读取数据的顺序与写入数据的顺序是一样的。FIFO的名称也由此而来:先入先出
,也是一个环形队列。
创建有名管道:
方式1:可以使用命令创建有名管道:
mkfifo 名字;
方式2:
使用函数mkfifo()
函数创建有名管道
使用mkfifo()
创建了FIFO后,就可以使用open()
打开它,常见的文件I/O函数都可以用于FIFO。
FIFO严格遵循先进先出
,对FIFO的读总是从开始处返回数据,对FIFO的写则是把数据添加到末尾,FIFO不支持lseek()
等文件定位的函数。
函数:mkfifo
- 参数说明:
- pathname:管道名称的路径;
- mode:FIFO的权限,和open是一样的;如0666;
- 返回值:成功返回0,失败返回-1,并设置对应的errno;
有名管道的注意事项
1、一个进程以只读打开管道会阻塞,直到另外一个进程以只写打开管道;
2、一个进程以只写打开管道会阻塞,直到另外一个进程以只读打开管道;
读管道:
管道中有数据,read返回实际读到的字节数;
管道中无数据:
管道写端被全部关闭,read返回0,相当于读到文件末尾;
管道写端没有被全部关闭,read阻塞等待;
写管道:
管道读端全部关闭,进程异常终止,收到信号SIGPIPE;
管道读端没有被全部关闭:
管道已经满了,write阻塞等待
管道没有满,write将数据写入,并返回实际写入的字节数
信号的机制
A 给 B 发送信号,B 收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。与硬件中断类似——异步模式。但信号是软件层面上实现的中断,早期常被称为“软中断”。
信号的特质:由于信号是通过软件方法实现,其实现手段导致信号有很强的延时性。但对于用户来说,这个延迟时间非常短,不易察觉。
每个进程收到的所有信号,都是由内核负责发送的,内核处理!
每个信号都有一个名字和编号,这些名字都以“SIG”开头,例如“SIGIO ”、“SIGCHLD”等等。
信号定义在signal.h头文件中,信号名都定义为正整数。
具体的信号名称可以使用kill -l来查看信号的名字以及序号,信号是从1开始编号的,不存在0号信号。kill对于信号0又特殊的应用。
信号的处理有三种方法,分别是:忽略 、捕捉 和 默认动作
注册和处理函数:
sighandler_t signal ( int signum, sighandler_t handler);
signum 是信号的编号,handler 是中断函数的指针。
信号发送函数
int kill ( pid_t pid , int sig );
pid:进程的pid号
sig: 信号的编号