Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78742
  • 博文数量: 22
  • 博客积分: 309
  • 博客等级: 二等列兵
  • 技术积分: 195
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-23 13:50
文章分类

全部博文(22)

文章存档

2014年(1)

2012年(21)

我的朋友

分类:

2012-10-24 15:43:08

原文地址:linux中的pipe和fifo的区别 作者:coxly

linux中的pipefifo的区别

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


阅读(733) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~