进程间通讯方式:管道(二)-------无名管道

原创 2018年04月17日 16:00:07

相对于有名管道,无名管道在文件目录树中没有文件描述符,所以无名管道要想完成进程间通讯,必须借助于父子进程在fork之前共享的文件描述符。相同的是,无名管道一个单向数据通道,进行半双工通讯。

无名管道的限制:无名管道只能用于有着亲缘关系的进程(父子进程、兄弟进程)之间。

无名管道的创建(父进程创建):int pipe(int fd[2]) ;f[0]指向管道的读端,f[1]指向写端。


使用:

        

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>cc
#include <ctype.h>

#define MAXLEN 256

int main()
{
	int fd1[2];
	int fd2[2];
	char tmp[MAXLEN] = {0};
	int check1 = pipe(fd1);
	int check2 = pipe(fd2);
	if( check1 == -1 || check2 == -1 )
	{
		perror("check");
		exit(0);
	}

	pid_t pid = fork();
	if( pid == 0 )//子进程接收父进程的数据并处理数据,再传给父进程
	{
		int i = 0 ;
		int co = 0 ;
		close(fd1[1]);
		close(fd2[0]);
		while(1)
		{
			co = read(fd1[0],tmp,MAXLEN);
			if( co == 0 || strncmp(tmp,"end",3) == 0 )
				break ;
			for( i = 0 ; i < co ;++i )
			{
				if( islower(tmp[i]) )
					tmp[i] = tmp[i] - 'a' + 'A';
			}
			write(fd2[1],tmp,strlen(tmp));
			memset(tmp,0,MAXLEN);
		}
		close(fd1[0]);
		close(fd2[1]);
	}
	else//父进程接收用户输入数据,传给子进程,再接收子进程处理的数据输出
	{
		close(fd1[0]);
		close(fd2[1]);
		while(1)
		{
			printf("father input:");
			fgets(tmp,MAXLEN-1,stdin);
			write(fd1[1],tmp,strlen(tmp)-1);
			if( strncmp(tmp,"end",3) == 0 )
				break ;
			memset(tmp,0,MAXLEN);
			read(fd2[0],tmp,MAXLEN);
			printf("father output:%s\n",tmp);
		}
		close(fd1[1]);
		close(fd2[0]);
	}
	exit(0) ;
}


        运行结果:

       

        往无名管道读写注意:

        一、父子进程运行不能保证先后顺序。

        二、跟有名管道一样是半双工,所以一个进程不要同时对一个无名管道进行读+写。

    

进程通信之无名管道

本节学习进程通信的另一种方式:管道。管道是一个进程连接数据流到另一个进程的通道,它通常把一个进程的输出通过管道连接到另一个进程的输入。在shell命令中经常会看到管道的应用,比如我们要列出当前文件下所...
  • yanziguilai
  • yanziguilai
  • 2014-10-15 17:20:05
  • 3337

linux无名管道和有名管道

1)无名管道:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。     单独构成一种独立的文件系统:管道对于管道两端...
  • yxtxiaotian
  • yxtxiaotian
  • 2017-04-07 16:27:04
  • 689

Linux进程通信(无名管道,有名管道,共享内存)的实现

Linux进程的通信有很多种方式,比如无名管道,有名管道,共享内存,Android进程通信采用的确是Binder机制~~~    在学习进程通信之前先学习一下System,Fork,Execive的...
  • szqsdq
  • szqsdq
  • 2015-09-17 16:11:25
  • 793

无名管道和有名管道的概念与实现

1.管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 2.只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 3.单独构成一种独立的文件系统:管道对于管道两端的进...
  • wzm10455
  • wzm10455
  • 2013-01-16 19:36:58
  • 1028

有名管道与无名管道之间的区别

1)无名管道:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。     单独构成一种独立的文件系统:管...
  • qq100440110
  • qq100440110
  • 2016-03-16 10:18:50
  • 1785

进程中通信的‘无名管道’和‘有名管道’的用法和二者的区别

今天我简单介绍一下“无名管道(pipe)”和“有名管道(mkfifo)”。 什么叫管道?简单的说就是一种通信方式,就是一个程序的输出直接连接到另一个程序的输入。 第一幅图就是管道的一个图解。其中fd[...
  • hbz1993
  • hbz1993
  • 2014-11-27 08:48:21
  • 1660

无名管道及用其实现父子进程间的通信

利用匿名管道实现剧本化的对话/*用无名管道进行通信 *采取剧本的方式 *2017-3-6 * */ #include #include #include #include #include #i...
  • derkampf
  • derkampf
  • 2017-03-06 22:12:40
  • 829

有名管道&无名管道

1、管道(pipe) 管道是进程间通信的主要手段之一。一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端。管道是一种特殊的文件,它不属于某一...
  • klarclm
  • klarclm
  • 2012-02-08 18:50:43
  • 5405

进程间通信方式总结——管道(一)

Linux/Unix系统IPC是各种进程间通信方式的统称,但是其中极少能在所有Linux/Unix系统实现中进行移植。随着POSIX和Open Group(X/Open)标准化的推进呵护影响的扩大...
  • tf_apologize
  • tf_apologize
  • 2017-04-13 16:28:47
  • 555

09-进程间通信-无名管道(父子进程间)

[TOC] (来自:http://blog.chinaunix.net/uid-26833883-id-3227144.html)一、什么是管道?管道是单向的、先进先出的,它把一个进程的输出和另一个...
  • a2604539133
  • a2604539133
  • 2017-04-15 11:28:25
  • 554
收藏助手
不良信息举报
您举报文章:进程间通讯方式:管道(二)-------无名管道
举报原因:
原因补充:

(最多只允许输入30个字)