linux进程通信之无名管道pipe

Linux 下进程通信称为IPC,共有如下几种方式:
半双工管道(无名管道)
FIFO(有名管道)
消息队列
信号量
共享内存

半双工管道通信(无名管道)适用于父子进程等有亲缘关系的进程通信。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>

/*
	在进程用无名管道进行通信时,需要分别管掉两个进程的读和写端,譬如进程1向进程2发消息,
	则进程1关闭读端,进程2关闭写端---无名管道是半双工的。
	
	用例操作父进程向子进程发消息

*/


int main(int argc,char*argv[])
{
	
	int ret=-1;
	int fd[2] ;       //创建两个管道文件描述符,用于两进程使用。
	int nread,nwrite;
	pid_t pid;      //用于存放进程id;
	
	int *write_fd=&fd[1];  //fd[1]端是文件描述符写端
	int *read_fd=&fd[0] ;  //fd[0] 端是文件描述符读端
	
	char message[]="你好,子进程,我是你爸爸"; //要发送的消息
	char recvbuf[1024];		//用于缓存收到的消息。
	
	
	ret=pipe(fd);   //创建无名管道
	if(ret==-1)
	{
		perror("pipe");
		exit(-1);
	}
	
	pid=fork();		//创建进程
	if(pid ==-1)
	{
	 perror("pid");
	 exit(-1);
	}
	else if(pid==0)
	{
		close(*write_fd);
		nread=read(*read_fd,recvbuf,sizeof(recvbuf));
		recvbuf[nread]='\0';
		printf("child recev:%d is %s\n",nread,recvbuf);
		return 0;
		
	}
	else
	{
		close(*read_fd);
		nwrite=write(*write_fd,message,strlen(message));
		printf("father send :%d\n",nwrite);
		return 0;
		
		
	}
	




	return 0;
}

运行结果:

zdg@ubuntu:/mnt/hgfs/SHARE/4.程序进线程$ ./a.out 
father send :36
zdg@ubuntu:/mnt/hgfs/SHARE/4.程序进线程$ child recev:36 is 你好,子进程,我是你爸爸

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值