1 、管道
开始介绍管道之前先介绍一下通信方式:
1-->单双工通信:有固定的发送放和接收方;
比如:收音机;广播;电台等;
2-->半双工通信:可以发送,也可以接收,同一时刻,要么在发送,要么在接收
比如:对讲机。
3-->全双工通信:可以发送也可以接收,随时收发数据。
比如:电话。
1.1 管道的特点:
1、属于半双工通信;
2、管道正常的情况下,管道中没有内容,read会发生阻塞;
3、管道文件和普通文件的区别:管道的内容,一旦读取后,就会消失;
4、管道文件不允许使用lseek等光标偏移函数;
5、管道一定遵循先进先出的原则
6、管道有大小:64k,共64*1024=65536个字节
1.2 无名管道
适用于父子进程之间的通信;
在没用名字的管道,没有真正的介质文件存在,仅仅以文件描述符的形式可以让我们操作;
1.2.1 创建无名管道
头文件:
#include <unistd.h>
函数原型:
int pipe(int pipefd[2]);
形参:pipefd -- 整形数组,2个元素
pipefd[0]:存放的管道的读端的文件描述符
pipefd[1]:存放的管道的写端的文件描述符
返回值:
成功返回0,失败返回-1;
用法:
int fd[2]={0};
pipe(fd);
在无名管道的使用中,想要父子进程间进行通信,先创建父进程,然后创建管道,最后创建子进程。这样的子进程会复制父进程的所有资源包括管道,这样就可以实现,管道通信。
1.3 有名管道
使用有名管道的流程:
1.创建管道文件 .fifo
2.打开管道文件 open
3.读写 读使用read,写使用,write
4.关闭 close
补充:
access函数 -- 判断文件是否有某种权限或者用于判断文件是否存在。
头文件:
#include <unistd.h>
函数原型:
int access(const char *pathname, int mode);
形参:
pathname:这是一个指向要检查的文件或者目录的路劲的指针。
mode:这是一个整数,指定要检查的访问类型。
可以是一下的值之一,也可以是他们的组和:
F_OK:测试文件是否存在
R_OK:测试读权限。
W_OK:测试写权限。
X_OK:测试执行权限。
返回值:
如果指定的访问类型被允许,则返回0;
如果指定的访问类型不被运行或发生错误,则返回-1
用法:
int res = access(“1.fifo”,F_OK);
if(res==0) 存在 res == -1 不存在
1.3.1 创建管道文件
头文件:
#include <sys/stat.h>
#include<sys/types.h>
函数原型:
int mkfifo(const char * pathname,mode_t mode)
参数:
pathname: 要创建的 FIFO 文件的名字( 路径+名字 以.fifo 结尾)
mode: 创建的 FIFO 文件的权限
真正的权限: mode &(~umask)
返回值:
成功返回 0,失败(如果管道文件原本存在,直接返回失败)返回-1.
1.3.2 打开文件
函数:open
头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
函数用法和函数原型:
int fd = open(char *pathname,int flag);
flag 只能在O_RDONLY和O_WRONLY中选择其一;
open函数在打开管道文件的时候,必须两方都执行open,open才能打开,只有一个进程执行open,open会发生阻塞,直到另外的一个进程也运行到open的位置,两方同时解除阻塞
1.3.3 有名管道的删除
头文件:
#include <unistd.h>
函数原型:
int unlink(const char * pathname)
参数:
pathname:要删除的FIFO文件的名字(带路径)
返回值:成功返回0,失败返回-1.
1.4 有名管道和无名管道各自有以下特点:
无名管道(Anonymous Pipe)
1. 创建方式:通常通过`pipe()`系统调用创建,创建后只能由创建它的进程及其子进程使用。
2. 单向通信:无名管道默认支持单向通信,数据只能在一个方向上流动(要么是父进程到子进程,要么是子进程到父进程)。
3. 无文件系统节点:无名管道没有文件系统中的对应节点,它们是完全存在于内存中的,因此它们是临时的。
4. 简单性:由于它们是内存对象,无名管道的创建和使用相对简单,不需要进行文件权限的设置。
5.生命周期:无名管道的生命周期与创建它的进程相关,当进程结束时,无名管道也会被销毁。
6. 使用场景:适合于父子进程之间的通信,或者需要快速、临时通信的场景。
有名管道(Named Pipe)
1. 文件系统节点:有名管道在文件系统中有一个对应的文件节点,可以通过文件路径进行访问。
2. 持久性:有名管道即使创建它的进程已经结束,也可以继续存在,直到被显式删除。
3. 多进程通信:有名管道可以被系统上任何具有适当权限的进程访问,适合于多对多的通信模式。
4. 同步机制:有名管道提供了一种同步机制,可以确保数据在写入和读取时的完整性。
5. 配置性:有名管道可以配置为阻塞或非阻塞模式,允许进程根据需要选择是否立即返回。
6. 安全性:由于有名管道存在于文件系统中,需要设置适当的文件权限来保证数据的安全。
7. 使用场景:适合于需要长期存在且多个进程或用户需要通信的场景,如系统服务与客户端之间的通信。
8. 创建方式:有名管道通常通过`mkfifo`命令或`mkfifo()`系统调用创建。