一、管道描述
管道:单向、传输、封闭、一个进口一个出口、先进先出
水管:内核空间一个管道文件
家:出水口 读端文件描述符
水厂:进水口 写端文件描述符
1.无名管道:只能用在父子进程间通信
操作函数
#include <unistd.h>
int pipe(int filedes[2]);
创建成功,返回值0,创建失败,返回值-1
这个函数会创建一个管道,并且数组filedes中的两个元素会成为管道读端和写端对应的两个文件描述符。即filedes[0]读端,filedes[1]写端。filedes[0]有可读属性,filedes[1]有可写属性。
管道两端的关闭是有先后顺序的,如果先关闭写端则从另一端读数据时,read函数将返回0,表示管道已经关闭;但是如果先关闭读端,则从另一端写数据时,将会使写数据的进程接收到SIGPIPE信号,如果写进程不对该信号进行处理,将导致写进程终止,如果写进程处理了该信号,则写数据的write函数返回一个负值,表示管道已经关闭。
2.有名管道:(一个特殊的文件,管道文件p)
无名管道只能在亲缘关系的进程间通信,大大限制了管道的使用,有名管道突破了这个限制,通过指定路径名的形式实现任意进程间的通信。
2.1使用命令创建
mkfifo FIFO_NAME
删除管道文件
unlink FIFO_NAME
一个终端
cat /tmp/my_fifo
另一个终端
echo hello > /tmp/my_fifo
2.2使用系统调用函数:
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
#include <unistd.h>
int unlink(const char *pathname);
对管道的操作,先打开,然后就读写
打开
open("/tmp/my_fifo",O_WRONLY|O_NONBLOCK)//非阻塞方式打开
error全局变量存放错误码,perror根据错误码打印出错误提示语句
perror("open");
如果以读取方式打开FIFO,并且还没有其它进程以写入方式打开FIFO,open函数将被阻塞;同样,如果以写入方式打开FIFO,并且还没其它进程以读取方式FIFO,open函数也将被阻塞。但是,如果open函数中包含O_NONBLOCK选项,则上述两种情况下调用open都不被阻塞
与无名管道相同,关闭FIFO时,如果先关读取端,将导致继续往FIFO中写数据的进程收到SIG_PIPE的信号。
原文:https://www.cnblogs.com/shiyk/p/10413664.html