24.9.3学习目录
一.管道(续)
1.文件描述符
dup2函数用于复制文件描述符,与dup的区别为调用的形式区别
将newfd作为oldfd的副本
int dup2(int oldfd,int newfd);
2.无名管道
管道称为无名管道,其是一种特殊类型的文件,在应用层体现为两个打开的文件描述符,最古老的进程间通信方式(IPC)
管道的特点:
- 半双工,数据在同一时刻只能在一个方向上流动
- 其数据遵循先入先出的规则
- 其传送的数据是没有格式的,其要求管道的读出方和写入方必须事先约定好数据的格式
- 其只存在于内存中
- 管道在内存中对应一个缓冲区,当写入的数据被读取,则会释放其数据的空间,用于写其他的数据
- 管道没有名字,所有其只能使用有血缘关系的进程中
#include <unistd.h>
//创建管道
int pipe(int filedes[2]);
//关闭端口
close(fd[]);
filedes数组中存放了管道的文件描述符fd[0],fd[1]
filedes[0]为读打开,filedes[1]为写而打开
3.有名管道(FIFO)
主要用于没有血缘关系的进程间通信,其是在物理内存中抽象出一部分内存规划为文件,用于进程间通信
特点:
- 有名管道拥有无名管道的所有特点
- FIFO在系统中作为特殊的文件存在,其没有文件大小永远都为0,内容则放置在内存中
- 当使用有名管道的进程都退出后,其还会存在系统中,用于服务于其他进程
#include <sys/types.h>
#include <sys/stat.h>
//传入pathname文件名,文件的权限描述符,其由于相当于文件,使用用文件API进行操作
int mkfifo(const char *pathname,mode_t mode);