named pipe其实就是pipe file,在sun操作系统中可以使用mknod pipe_file_name p来创建,操作pipe file与普通文件相同,特别的地方在于:
(1) 对于pipe file,以读打开和以写打开需要成对出现,如果只出现一个,如,只以读打开pipe file,而没有以写打开pipe file,那么该读打开(open)操作会被阻塞,即并没有真正打开pipe file,一直到有以写打开的pipe file。
(2) 写入pipe file的内容会被以先进先出的顺序读出,被读出的内容不会继续存在于pipe file中,即pipe file是一种FIFO队列。所以,ls –l看到的pipe file大小一般是0字节的。
(3) 由于pipe file这种读写操作成对出现及一旦对pipe file有写入的内容,就马上会被读出,所以它可以保证读写的原子操作,不像fprint函数,fprint函数会出现输出内容交叉的情况,如,如果4.5个fprint函数就把缓冲区填满了,那么第5个fprint函数的前一半输出到缓冲区的内容会write函数首先写入文件,第5个fprint函数的后半个内容会等到下一个缓冲区填满(或者强制刷新缓冲区)才到真正输出的文件,而在这两个时间段之间,如果有其它进程对相同的文件进行写操作,那么以后在该文件中会看到第5个fprint函数的内容之间夹带了其它内容。
(4) 测试,读写操作的成对性:
cat abcd >pipe_file
在unix系统中使用cat 命令将abcd文件的内容写入pipe_file,而实际上abcd这个文件不存在。由于unix中对一个command line会首先执行其中的重定向操作,即>pipe_file,而此时,没有为读而打开该pipe_file,因此,重定向操作打开pipe_file会被阻塞,因此cat打开abcd的操作并没有执行,因此上述命令不会报错打不到abcd这个文件。
一旦有为读操作打开pipe_file,如cat <pipe_file,第一个命令的>pipe_file重定向操作的写打开pipe_file会执行,接下来cat abcd也会被执行,这时会报
cat: cannot open abcd的错误。