管道和FIFO
管道
管道主要有以下两个特点:
1. 它们是半双工的。数据只能在一个方向上流动;
2. 它们只能在具有公共祖先的进程之间使用。
典型实现的通信形式如下图:
以双向数据流为例主要代码如下:
int main()
{
int fd1[2],fd2[2];
pid_t childpid;
pipe(fd1);
pipe(fd2);
if( (childpid = fork() )==0)
{
close(fd1[1]);
close(fd2[0]);
server(fd1[0],fd2[1]); //子进程从管道fd1[0]接收父进程消息,从管道fd2[1]向父进程发送消息
exit(0);
}
close(fd1[0]);
close(fd2[1]);
client(fd2[0],fd1[1]); //父进程从管道fd2[0]接收父进程消息,从管道fd1[1]向子进程发送消息
waitpid(childpid,NULL,0);
return 0;
}
FIFO
由于pipe没有名字,因此它们最大的劣势是只能用于有一个共同的祖先进程的各个进程之间。FIFO(first in,first out),类 似于管道,它是一个单向(半双工)数据流。不同于管道的是,每个FIFO有一个路径名与之关联,从而允许无亲缘关系的进程访问同一个FIFO。FIFO也称为命名管道(named pipe)。