匿名管道:
只能⽤用于具有共同祖先的进程(具有亲缘关系的进程)之间进⾏行通信;
通常,⼀一个管道由⼀一个进程 创建,然后该进程调⽤用fork,此后⽗父、⼦子进程之间就可应⽤用该管道。
管道提供流式服务 ⼀一般⽽而⾔言,进程退出,管道释放,所以管道的⽣生命周期随进程 ⼀一般⽽而⾔言,内核会对管道操作进⾏行同步与互斥 管道是半双⼯工的,数据只能向⼀一个⽅方向流动;
需要双⽅方通信时,需要建⽴立起两个管道
匿名管道实现从键盘读取写入管道,读取数据输出到屏幕。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main (void)
{
int fds [2];
char buf[100];
int len;
if (pipe (fds) == -1)
perror ("make pipe"),exit(1);
while ( fgets (buf, 100,stdin))
{
len = strlen (buf);
if (write (fds[1], buf, len) != len)
{ perror ("write to pipe");
break;
}
memset (buf, 0x00, sizeof (buf));
if ((len = read(fds[0], buf, 100)) == -1)
{
perror ("read from pipe");
break;
}
if (write (1, buf, len) != len)
{ perror ("write to stdout");
break;
}
}
}
运行结果:
命名管道:
管道应⽤用的⼀一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。 如果我们想在不相关的进程之间交换数据,可以使⽤用FIFO⽂文件来做这项⼯工作,它经常被称为命名 管道。 命名管道是⼀一种特殊类型的⽂文件
命名管道的创建:
命名管道可以从命令⾏行上创建,命令⾏行⽅方法是使⽤用下⾯面这个命令:
$ mkfifo filename
命名管道也可以从程序⾥里创建,相关函数有:
int mkfifo(const char *filename,mode_t mode);
创建命名管道:
int main(int argc, char *argv[]) { mkfifo("p2", 0644); return 0; }
命名管道和匿名管道的区别:
匿名管道由pipe函数创建并打开。 命名管道由mkfifo函数创建,打开⽤用open FIFO(命名管道)与pipe(匿名管道)之间唯⼀一的区别在它们创建与打开的⽅方式不同,⼀一但这些 ⼯工作完成之后,它们具有相同的语义。