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 你好,子进程,我是你爸爸

发布了20 篇原创文章 · 获赞 1 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览