Linux编程 进程间通信------无名管道(PIPE)

无名管道(PIPE)只是用于父子进程间通讯

PIPE是Linux进程间通信方法之一,是一个单向通道,先进先出,管道的尾端为写端,描述符pipe_fd[1] . 头部为读端,描述符为pipe_fd[0](注意,强制规定)


主要函数 :pipe(pipe_fd) //创建无名管道

下面介绍一个小例子:

程序功能:在父进程中创建一无名管道,并创建子进程来读该管道,父进程来写该管道

源码:

#include<unistd.h>
#include<sys/types.h>
#include<errno.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int pipe_fd[2];
pid_t pid;
char buf_r[100];
char p_wbuf;
int r_num;
memset(buf_r,0,sizeof(buf_r));
/*创建管道*/
 if(pipe(pipe_fd)<0)
 {
	printf(pipe create error\ n")∶
	return 1;
 }
/*创建子进程*/
 if((pid=fork())==0) //子进程执行序列
 {
	pontf("\n");
	dose(pipe_fd[1]); //子进程先关闭了管道的写端
	sleep(2); //让父进程先运行,这样父进程先写子进程才有内容读
  if(r_num=read(pipe_fd[0],buf_r,100))>0)
  {
	printf("%d numbers read from the plpe is %s\n",r_num,buf_r);
  }
	close(pipe_fe[0]);
	exit(0);
 }
 else if(pid>0) //父进程执行序列
 {
	close(pipe_fd[0]); //父进程先:关闭了管道的读端
	if(write(pipe_fd[1],"Hello",5)!=-1)
		printf("parent write 1 Hello!\n");
	if(write(pipe_fd[1],"Pipe",5)!=-1)
		printf("parent write 2 Pipe!\n");
	close(pipe_fd[1]);
	waitpid(pid,NULL,0); //等待子进程结束
	exit(0);
 }
 return O;
}
结果:

上述代码中父进程关闭管道的读端,子进程关闭管道的写端(想想为什么这么做???)

答:由于fork函数让子进程完整地拷贝了父进程的整个地址空间,所以父子进程都有管道的读端和写端。我们往往希望父子进程中的一个进程写一个进程读,那么写的进程最好关闭掉读端,读的进程最好关闭掉写端。再来看代码:我们是从父进程向子进程写数据,所以我们关闭了子进程的写端pipe_fd[1]和父进程的读端pipe_fd[0]


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值