进程间通信—管道

进程间通信的方式:

(1)管道:一种两个进程间进行单向通信的机制,半双工的通信方式。数据只能单方向流动,

而且只能在具有亲缘关系(父子进程、兄弟进程)的进程间使用。

从通信的双方信息交互的方式分三种基本模式:

单工通信(单向通信)  只有一个方向的通信而没有反方向的交互(信息流是单方向的),发送端和接收端的身份是固定的;

半双工通信(双向交替通信)双方均可以发送、接收信息,但是同一时刻里,信息只能有一个传输方向;

全双工通信(双向同时通信)  双方可以同时发送和接收信息。

(2)有名管道:(FIFO)半双工的通信方式,克服了只能有亲缘关系的进程通信的限制。

(3)信号量;4)消息队列;(5)信号(chapter 9);(6)共享内存;7)套接字。


关于父子进程间的管道建立,想必大家都是了解的,但是实际应用中,我们并不这样去建立,

我们一般是建立FIFO的管道通信,这样有利于维护和进程间限制。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
int main()
{
	char buff[1024]={0};
	int fd;
	if(mkfifo("fifo",0777))
	{
		perror("mkfifo error");
	}
	fd=open("fifo",O_WRONLY);
	if(fd<0)
	{
		perror("open error");
	}
	printf("All ready,please enter:\n");
	while(fgets(buff,sizeof(buff)-1,stdin)!=NULL)
	{
		write(fd,buff,strlen(buff));
		memset(buff,0,sizeof(buff));
	}
	close(fd);
	return 0;
}

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
	char buff[1024]={0};
	int fd;
	int ret,count;
	fd=open("fifo",O_RDONLY);
	if(fd<0)
	{
		perror("open error");
	}
	while(1)
	{
		count=0;
		while(count<(sizeof(buff)-1))
		{
			ret=read(fd,buff+count,1);
			if(ret < 1)
			{
				printf("exit\n");
				close(fd);
				unlink("fifo");
				exit(0);
			}
			if(buff[count] == '\n')
				break;
			count++;
		}
		printf("recrive message:%s",buff);
		memset(buff,0,sizeof(buff));
	}
	return 0;
}


我们建立两个进程间的管道,循环从键盘中读入数据,在另一个进程中读出打印。

程序运行结果如下:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值