学习匿名管道pipe基于父子进程的通信:
匿名管道只能实现相关进程或者说是父子进程之间的通信.
如果要进行父子进程通信必须要先由父进程创建管道,然后调用fork来创建子进程,才能通信。同一个进程对于同一个管道只能做一件事情要么读管道,要么写管道不可能读写同一个管道,所以通常父进程若是用该管道写数据就会关闭读短。fork之前创建的管道是由父子进程共享,实其是复制了管道的描述符,因此操作的内容是一样的。不要把它想象成两个地址空间.
int fd[2];
main()
{
pipe(&fd[0]);
int ret = fork();
close(fd[1]); //父进程关闭写端,只能从管道0读数据
switch(ret)
{
case 0:
execvp();
close[fd[0]]; //子进程关闭读端,可以从管道1写数据
}
}
命名管道可以实现互不相关进程的通信
命名管道与普通文件的区别:
管道比一般的文件的灵活,因为一般的文件写进去的数据是一直存在的,而管道是随着读的过程数据在减少。
文件读到某位就会结束,而管道会用等待的方式来处理,在通信的过程中由于速率的问题通常会用到管道。比如
调试的cli通常使用命名管道来传递。