您的位置:首页 > 运维架构 > Linux

linux进程通信之使用匿名管道进行父子进程通信

2016-11-26 14:28 591 查看
管道:是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称pipe文件。
  管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。
  写进程在管道的尾端写入数据,读进程在管道的首端读出数据。
  数据读出后将从管道中移走,其它读进程都不能再读到这些数据。
  管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。

  

      匿名管道

  匿名管道:进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。在系统中没有实名,不能在文件系统中以任何方式看到该管道,它只是进程的一种资源,会随着进程的结束而被系统清除只能用于具有亲缘关系的进程之间,如父子进程或兄弟进程之间

  例子:写一程序 父进程创建子进程,并向子进程通过匿名管道传送信息hello,子进程接收到信息向父进程传送hi

  

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#define BUFSZ 256

int main(void)
{
int fd[2];
char buf[BUFSZ];
pid_t pid;
int len;
if( pipe(fd)<0 )
{
perror("failed to pipe");
exit(1);
}
if( (pid = fork())<0 )
{
perror("failed to fork");
exit(1);
}
else if(pid > 0)
{
printf("This is farther, write hello to pipe\n");
write(fd[1], "hello\n", 25);
sleep(1);
read(fd[0], buf, BUFSZ);
printf("father read result is %s\n", buf);
exit(0);
}
else
{
printf("This is child ,read from pipe\n");
read(fd[0], buf, BUFSZ);
printf("child read result is %s\n", buf);
printf("This is child, write reply to pipe\n");
write(fd[1], "hi\n", 50);
}
return 0;
}


  运行结果: 

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: