LV6 day11 有名管道和无名管道

一、无名管道

无名管道是Linux中管道通信的一种原始方法,如图所示
在这里插入图片描述

具有以下特点:
1.只能用于具有亲缘关系的进程之间的通信(父子进程或兄弟进程)
2.是一个单工的通信模式,具有固定的读端和写端
3.管道也可以看成一种特殊的文件,对于它的读写也可以使用普通的read()、write()等函数。但是它不属于任何文件系统,并且只存在于内核内存中
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
	int pfd[2];
	int re;
	int i;
	pid_t pid;
	re=pipe(pfd);
	char buf[20]={0};
	if(re<0)
	{
	perror("pipe");
	return 0;
	}
	for(i=0;i<2;i++){
	pid=fork();
	if(pid<0){
	perror("pid");
	}else if(pid>0)
	{

	}
	else{
	break;
	}
	
	}
	if(i==0)
	{
	close(pfd[0]);
	while(1){
	strcpy(buf,"this is 1 process\n");
	write(pfd[1],buf,strlen(buf));
	sleep(1);
	}
	return 0;
	}
	if(i==1)
	{
	close(pfd[0]);
	while(1){
	strcpy(buf,"this is 2 process\n");
	write(pfd[1],buf,strlen(buf));
	sleep(1);
	}
	return 0;
	}
	if(i==2)
	{
	close(pfd[1]);
	while(1)
	{
		memset(buf,0,20);
	re=read(pfd[0],buf,20);
	if(re>0){
	printf("%s\n",buf);
	}
	}
	return 0;
	}
}

二、有名管道

有名管道是无名管道的一种改进,如图所示
在这里插入图片描述

它具有以下特点:

1.它可以使两个互不相关的进程实现彼此通信

2.该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了有名管道之后,两个进程就可以把它当作普通文件进行读写操作,使用非常方便

3.FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加的末尾。有名管道不支持如sleek()等文件定位操作

fifo.c

写入字符

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char *argv[])
{
	int re;
	int fd;
	char buf[32];
	re=mkfifo("/myfifo",0666);
	if(re<0){
		
		perror("mkfifo");
	//	return 0;
	}
  	fd=open("/myfifo",O_WRONLY);
	
	while(1){
		fgets(buf,32,stdin);
		write(fd,buf,strlen(buf));


}
}
fifor.c

读取写入字符

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
	int re;
	int fd;
	char buf[32]={0};
/*	re=mkfifo("/myfifo",0666);
	if(re<0){
		
		perror("mkfifo");
		return 0;
*/	
  	fd=open("/myfifo",O_RDONLY);
	if(fd<0){
	perror("open");
	return 0;
	
	}
	while(1){
		re=read(fd,buf,32);
	if(re>0){	printf("read fifo=%s\n",buf);
	}else if(re==0)
	{
	exit(0);
	}
}
}

可以实时读取键盘输入内容实时读取

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值