红联Linux门户
Linux帮助

linux中的pipe和fifo的区别

发布时间:2008-07-21 10:42:39来源:红联作者:Olcevt
在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交换。
文章评论

共有 2 条评论

  1. txgc_wm 于 2011-03-27 00:15:18发表:

    不错

  2. ahhygx 于 2011-03-14 21:57:43发表:

    fifo 不是全双工吧? 同是打开2个fifo 才可以实现全双工吧!