进程间通信——无名管道pipe

特点:

1、半双工,数据单向流通。

2、用于具有亲缘关系的进程,如父子进程或者兄弟进程。

3、是一种特殊的文件,存在于内存当中。

1、无名管道的创建

使用函数pipe()来创建一个无名管道

函数原型: int pipe(int fd[2]);

功能:创建一个无名管道

返回值:成功0,失败-1。

参数说明:fd是一个有两个元素的整型数组。表示两个文件描述符,分别代表管道的读端pipefd[0]和写端pipefd[1]。

2、无名管道的使用

对管道的读端fd[0]和写端fd[1]分别进行read和write操作,例如下面的编程练习,在父进程写入了数据,在子进程读取了数据,如此就完成了父子进程间的通信,写入时注意关闭读端,即close(fd[0]),在读取时要关闭写端,即close(fd[1]),fd不能open

3、编程练习

创建一个无名管道,在父进程中写入信息,在子进程读取信息。

#include<stdio.h>
#include <unistd.h>
#include<string.h>
int main()
{
	int fd[2];//fd是pipe的参数,分别对应一个文件描述符,都端fd[0],写端fd[1]
	if(pipe(fd)==-1){返回  //pipe  返回值成功0,失败-1。
		printf("pipe error!\n");
	}
	char *buf="hello world";
	char readbuf[128];
	int pid=fork();//在父进程写入了数据,在子进程读取了数据,如此就完成了父子进程间的通信
	if(pid>0){
		close(fd[0]);//写入前关闭读端
		write(fd[1],buf,strlen(buf)+1);//在写端写入了数据
		printf("write over \n");
	}
	else if(pid==0){
		close(fd[1]);//读取前关闭写端
		read(fd[0],readbuf,strlen(buf)+1);//在读端读取了数据
		printf("read over readbuf:%s\n",readbuf);
	}
	else{
		printf("fork defeat\n");
	}	
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值