分类: LINUX
2015-08-31 19:57:18
原文地址:linux中的pipe和fifo的区别 作者:coxly
linux中的pipe和fifo的区别
在linux进程间通信(IPC)可以通过信号量、文件系统、消息队列、共享内存还有管道来实现的。其中消息队列、内存管理是在System V中提出的。
进程通信间涉及到了管道,而且管道在shell命令中也大有用处。那就简要说说管道:
管道顾名思义,你可以将其理解为日常生活中的管子,一边流入,一边流出。它可以有半双工和全双工。半双工就是只能一边流入,另一边流出;全双工则是一边可以流入,也可以流出。
pipe就是一种半双工的管道。其中,fd[1] 用来向管道中写入数据,而fd[0]在另一端用来读出数据。如果现有两个进程要利用pipe进行通信。此时,就要保证只能有一个写入端和一个读出端,即:fd[1]和fd[0]只能有一个。
如下程序:
/*实现子进程向管道中写入数据,父进程读出数据*/
#include
#include
#include
#include
#include
int main()
{
pid_t childpid;
int fd[2],nbytes;
char string[]="data from child process\n";
char buf[100];
if(pipe(fd)<0)
{
perror("pipe");
exit(1);
}
if((childpid=fork())==-1)
{
perror("fork");
exit(1);
}
if(childpid==0)
{
close(fd[0]);
printf("childpid =%2d\n",getpid());
write(fd[1],string,strlen(string));
exit(0);
}
else
{
close(fd[1]);
printf("parentpid =%2d\n",getppid());
nbytes=read(fd[0],buf,sizeof(buf));
printf("Received string:%s\n",buf);
}
return 0;
}
下面来说道fifo:
fifo是一种全双工,即:它的一端既可以进行读取fd[0],也可以进行写入fd[1]。
正因为它的这种通信方式,使其可以用来涉及基于C/S模式的网络通信。具体做法:
首先让服务器产生一个服务器端的FIFO,然后让各个客户端产生以其PID为名称的客户端的FIFO,在客户于服务器进行通信时,客户端向服务器端发送自己的PID,以使服务器对客户的请求进行响应时,向其客户端的FIFO写入响应信息。代码实现客户端和服务器进行各自的名称和PID交换。
具体代码见: http://control.cublog.cn/index.php