进程通信-管道
//让进程间相互影响,相互收发信息(全局变量不行)
//父子进程可以,两个不同程序的进程也可以
相关概念
管道:无名管道/有名管道
//名指路径名//有没有使用文件
管道文件fifo
单工,双工,半双工(收发一时其一)
无名管道
特点:
- 固定读写段,fd[0]读/fd[1]写,读端只能读/写端只能写
- 阻塞,进程没有写入,read会阻塞//无名管道内没有数据,管道堵塞,等待输入
- 只能用于有血缘关系的进程,即兄弟进程之间通信
//<unistd.h>
int pipe(int pipefd[2])
//无名管道创建
例:
//使用系统IO操作
int fd[2];
pipe(fd);//存入两个文件描述符
write/read;
close(fd[0]);//本质是文件描述符
close(fd[1]);
有名管道
特点:
- 有管道文件
- 只能在纯粹的linux环境下运行//在共享文件下会出现'找不到目录或文件'的报错
//linux的特殊文件都是这样//软连接,管道文件... - 有名管道通信时,必须使用同一个fifo文件
//新建有名管道文件//<sys/types.h><sys/stat.h>
int mkfifo(const char *pathname,most_t mode)
//mode: 掩码/一般设置为0777
//只是创建,没有判断能力
//使用前access下,看看有无文件
//<unistd.h>
int access(const char *pathname,int mode)
//mode: R_OK,W_OK,X_OK(可执行),F_OK(文件存在)
例:
int fd,ret;
ret=access("fifo",F_OK);
if(ret != 0)
mkfifo("fifo",0777);
fd=open("fifo",O_RDWR);
write/read;
close(fd);
两者区别/注意事项
两者区别
- 有名管道生成文件/无名管道不生成文件
- 有名只有一个文件描述符,可读可写/无名两个,针对性读写
注意事项
- 有名管道注意使用阻塞或信号,防止快速循环
- 文件描述符的使用,文件创建的位置