有名管道
有名管道(FIFO)。
有名管道是持久稳定的。
它们存在于文件系统中。
FIFO比无名管道作用更大,因为它们能让无关联的进程之间交换数据。
一个shell命令可以建立有名管道
mkfifo [option] name
mkfifo创建一个名为name的有名管道
mkfifo fifo1。
–创建一个有名管道fifo1。
cat < fifo1。
–通过cat命令从fifo1中读取数据。
ls > fifo1。
–将ls命令输出的结果写入fifo1中
创建fifo。
int mkfifo(const char *pathname, mode_t mode)
函数执行成功返回0,否则返回-1,并设置变量errno。
mkfifo函数例子。
int main(int arg, char *args[]) { mkfifo("fifo1", 0666); return 0; }
删除fifo。
int unlink(const char *pathname);
函数执行成功返回0,否则返回-1,并设置变量errno。
unlink函数例子。
int main(int arg, char * args[]) { int i = unlink("fifo1"); if (i == -1) { printf(strerror(errno)); } return 0; }
打开和关闭FIFO。
int open(const char *pathname, int flags);
int close(int fd);
Linux的一切都是文件这一抽象概念的优势,打开和关系FIFO和打开关闭一个普通文件操作是一样的。
FIFO的两端使用前都必须要打开
在读写FIFO时,如果FIFO以O_NONBLOCK和O_RDONLY标志打开,那么调用马上就会返回
如果在读写FIFO时,如果FIFO以O_NONBLOCK和O_WRONLY标志打开,在FIFO还没有为读出数据打开时,调用open会返回一个错误。
如果open中没有指定O_NONBLOCK,O_RDONLY将阻塞open调用,一直到另一个进程为写入数据打开FIFO为止。相同的,O_WRONLY也导致阻塞一直到为读出数据打开FIFO为止。
向一个没有为读出数据打开的FIFO写入数据会导致SIGPIPE信号,并设置errno。
在最后一个写数据的进程关闭FIFO以后,读数据的进程能在它下一次的读操作中监测到EOF标志
读FIFO例子
int main(int arg, char * args[]) { int len = 0; char buf[PIPE_BUF]; memset(buf, 0, sizeof(buf)); int fd = open("fifo1", O_RDONLY); while ((len = read(fd, buf, sizeof(buf))) > 0) { printf("%s\n", buf); } close(fd); return 0; }
写FIFO例子
int main(int arg, char * args[]) { int len = 0; char buf[PIPE_BUF]; memset(buf, 0, sizeof(buf)); int fd = open("fifo1", O_WRONLY); while(1) { scanf("%s", buf); if (buf[0] == '0') break; write(fd, buf, sizeof(buf)); } close(fd); return 0; }