特殊文件

文档状态:编辑中....


Table of Contents

管道[PIPE]

我对管道的理解即存在于内核空间中可以向多个用户空间进行映射的文件生成这种思考的起因很简单,但是我目前的想法不一定对,因为管道可以实现多进程之间实现通信,但是因为进程各自占有自己的进程空间,有自己的文件描述符表,但是管道的文件的描述符可以在多个进程中实现公用,所以我认为由管道的创建方式我们很容易看出,只有创建它的进程和fork出的进程才能使用你会发现在linux的shell中运行的多个程序看起来就是单独运行的,但是却能使用|进行通信,事实很清晰,他们都是当前shell衍生的子进程,你可以使用ps -ef 和lsof -p parentid联合查看
[阻塞性IO]对管道进行read:
1. 管道不为空 立即返回
2. 管道为空
|存在进程为写操作打开管道,阻塞到数据写入管道
|
不存在进程为写操作打开管道,返回0,表示遇到文件尾

tips

无论是对一般文件还是特殊文件进行原生的read,write读写,都存在一个非常令人厌恶的小问题,即操作的原子性,虽然很多应用层的封装的读写函数实现了原子锁确保读写的原子性,但是read和write这种系统调用不能实现原子性,所以在进行操作的过程中难免因为一些高级别的软硬中断打断,对于这种现象,存在两种解决方案,1.自己写重启库2.使用原子锁对操作进行同步

使用方式[UNIX]

#include <unistd.h>
int fd[2];
if(pipe(fd)==-1)
    perror("****");

MESSY

  1. pipe和fifo都有一个重要的特性----他们都能保证不超过PIPE-BUF个的写入字节操作是原子的,不会出现在使用fprintf做原子日志的时候的各种考虑,很显然fprintf不是原子的。适合在cs模型中使用,来自多个客户机的消息片断都有可能发生交错。[在这里我认为的原子性是多进程竞争时的原子即必须等次操作完才可以执行进程切换或者是其他中断]