有名管道fifo

mkfifo函数使用
[code]mkfifo(建立实名管道)
相关函数
pipe,popen,open,umask
表头文件
#include<sys/types.h>
#include<sys/stat.h>
定义函数
int mkfifo(const char * pathname,mode_t mode);
函数说明
mkfifo ()会依参数pathname建立特殊的FIFO文件,该文件必须不存在,而参数mode为该文件的权限(mode%~umask),因此 umask值也会影响到FIFO文件的权限。Mkfifo()建立的FIFO文件其他进程都可以用读写一般文件的方式存取。当使用open()来打开 FIFO文件时,O_NONBLOCK旗标会有影响
1、当使用O_NONBLOCK 旗标时,打开FIFO 文件来读取的操作会立刻返回,但是若还没有其他进程打开FIFO 文件来读取,则写入的操作会返回ENXIO 错误代码
2、没有使用O_NONBLOCK 旗标时,打开FIFO 来读取的操作会等到其他进程打开FIFO文件来写入才正常返回。同样地,打开FIFO文件来写入的操作会等到其他进程打开FIFO 文件来读取后才正常返回。
返回值
若成功则返回0,否则返回-1,错误原因存于errno中。
 
 
使用有名管道十分简单:你如同使用一个普通文件一样打开它,用read()和 write()进行操作。但对管道使用open()时可能引起阻塞,下面一些常用规律可以参考:
  • 如果你同时用读写方式(O_RDWR)方式打开,则不会引起阻塞。
  • 如果你用只读方式(O_RDONLY)方式打开,则open()会阻塞一直到有写方打开管道, 除非你指定了O_NONBLOCK,来保证打开成功。
  • 同样以写方式(O_WRONLY)打开也会阻塞到有读方打开管道,不同的是如果 O_NONBLOCK被指定open()会以失败告终。
 
 
 
在读写有名管道之前需要用open函数打开该有名管道,打开有名管道操作与其他文件有一定的区别,如果希望打开管道的写端,则需要另一个进程打开该管道的读端,如果只打开有名管道的一端,则系统将暂时阻塞打开进程,直到另一个进程打开管道的另一端,当前进程才会继续执行,因此,在使用有名管道时一定要使用两个进程分别打开其读端和写端!
原文地址:https://www.cnblogs.com/nufangrensheng/p/2941251.html