IOday7

一、思维导图

二、练习题

1> 使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份

//创建有名管道

#include<myhead.h>
int main(int argc, const char *argv[])
{
	//创建一个有名管道文件
	if(mkfifo("./pipefile",0664) == -1)
	{
		perror("mkfifo error");
		return -1;
	}

	printf("create success\n");

	return 0;
}

//发送数据到有名管道

#include<myhead.h>
int main(int argc, const char *argv[])
{
	//发送数据
	//以写的形式打开管道文件
	int wfd = open("./pipefile",O_WRONLY);
	if(wfd == -1)
	{
		perror("open error");
		return -1;
	}
	printf("open pipe write success\n");

	//定义容器从标准输入写入数据到管道文件中
	char wbuf[128] = "";
	while(1)
	{
		printf("please enter >>>");
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf)-1] = 0; 		//将'\n'换成'\0';

		//将数据写入管道文件中
		write(wfd,wbuf,strlen(wbuf));

		//判断退出标志
		if(strcmp("quit",wbuf) == 0)
		{
			break;
		}

	}
	//关闭文件描述符
	close(wfd);

	return 0;
}

//从有名管道读取数据

#include<myhead.h>
int main(int argc, const char *argv[])
{
	//接收数据
	//以只读形式打开管道文件
	int rfd = open("./pipefile",O_RDONLY);
	if(rfd == -1)
	{
		perror("rfd open error");
		return -1;
	}
	printf("open pipe read success\n");

	//以只写的形式打开聊天记录文件
	int cfd = open("./chat.txt",O_WRONLY|O_CREAT|O_TRUNC,0664);
	if(cfd == -1)
	{
		perror("cfd open error");
		return -1;
	}

	//定义容器从管道文件中读取数据
	char rbuf[128];
	while(1)
	{
		//清空容器
		bzero(rbuf,sizeof(rbuf));
		//将管道文件中的数据写入到容器中
		read(rfd,rbuf,sizeof(rbuf));
		//判断退出标志
		if(strcmp(rbuf,"quit") == 0)
		{
			break;

		}
		//将读数据容器输出到终端
		printf("received message:%s\n",rbuf);	

		rbuf[strlen(rbuf)] = '\n';	//将读数据容器末尾加上换成'\n'
		//将读数据容器写入到聊天记录文件中
		write(cfd,rbuf,sizeof(rbuf));
	}

	//关闭文件描述符
	close(rfd);
	close(cfd);

	return 0;
}

2> 使用有名管道实现两个进程间相互通信

//创建有名管道

#include<myhead.h>
int main(int argc, const char *argv[])
{
	//创建两个有名管道文件
	//A向B发送消息的管道
	if(mkfifo("./AtoB",0664) == -1)
	{
		perror("AtoB mkfifo error");
		return -1;
	}
	printf("AtoB create success\n");

	//B向A发送信息的管道
	if(mkfifo("./BtoA",0664) == -1)
	{
		perror("BtoA mkfifo error");
		return -1;
	}
	printf("BtoA create success\n");

	return 0;
}

//A程序

#include<myhead.h>
int main(int argc, const char *argv[])
{
	//创建子进程
	pid_t pid = fork();
	if(pid == 0)
	{
		//父进程,A向B发送数据,管道AtoB
		//以写的形式打开管道文件
		int wfd = open("./AtoB",O_WRONLY);
		if(wfd ==-1)
		{
			perror("AtoB wfd open error");
			return -1;
		}
		printf("open AtoB write success\n");

		//定义容器将标准输入写入数据到管道文件中
		char wbuf[128] = "";
		while(1)
		{
			usleep(10);
		//	printf("please enter >>>");
			fgets(wbuf,sizeof(wbuf),stdin);
			wbuf[strlen(wbuf)-1] = 0; 			//将'\n'换成'\0'

			//将数据写入到管道文件AtoB中
			write(wfd,wbuf,strlen(wbuf));

			//判断退出标志
			if(strcmp("quit",wbuf) == 0)
			{
				break;
			}
		}
		//关闭文件描述符
		close(wfd);
		//退出子进程
		exit(EXIT_SUCCESS);

	}
	else if(pid > 0)
	{
		//子进程,A从B读取数据,管道BtoA
		//以只读的形式打开管道文件BtoA
		int rfd = open("./BtoA",O_RDONLY);
		if(rfd == -1)
		{
			perror("BtoA rfd open error\n");
			return -1;
		}
		printf("open BtoA read success\n");

		//定义容器从管道文件中读取数据
		char rbuf[128];
		while(1)
		{
			//清空容器
			bzero(rbuf,sizeof(rbuf));
			//将管道文件中的数据写入到容器中
			read(rfd,rbuf,sizeof(rbuf));
			//判断退出标志
			if(strcmp("quit",rbuf) == 0)
			{
				break;
			}
			//将读数据容器输出到终端
			printf("received message from B:%s\n",rbuf);
		}
		//关闭文件描述符
		close(rfd);
	}

	//回收子进程
	waitpid(-1,NULL,WNOHANG);
	return 0;
}

//B程序

int main(int argc, const char *argv[])
{
	//创建子进程
	pid_t pid = fork();
	if(pid == 0)
	{
		//父进程,B向A发送数据,管道BtoA
		//以写的形式打开管道文件
		int wfd = open("./BtoA",O_WRONLY);
		if(wfd ==-1)
		{
			perror("wfd open error");
			return -1;
		}
		printf("open BtoA write success\n");

		//定义容器将标准输入写入数据到管道文件中
		char wbuf[128] = "";
		while(1)
		{
			usleep(10);
//			printf("please enter >>>");
			fgets(wbuf,sizeof(wbuf),stdin);
			wbuf[strlen(wbuf)-1] = 0; 			//将'\n'换成'\0'

			//将数据写入到管道文件BtoA中
			write(wfd,wbuf,strlen(wbuf));

			//判断退出标志
			if(strcmp("quit",wbuf) == 0)
			{
				break;
			}
		}
		//关闭文件描述符
		close(wfd);
		//退出子进程
		exit(EXIT_SUCCESS);


	}
	else if(pid > 0)
	{	
		//子进程,B从A读取数据,管道AtoB
		//以只读的形式打开管道文件AtoB
		int rfd = open("./AtoB",O_RDONLY);
		if(rfd == -1)
		{
			perror("AtoB rfd open error\n");
			return -1;
		}
		printf("open AtoB read success\n");

		//定义容器从管道文件中读取数据
		char rbuf[128];
		while(1)
		{
			//清空容器
			bzero(rbuf,sizeof(rbuf));
			//将管道文件中的数据写入到容器中
			read(rfd,rbuf,sizeof(rbuf));
			//判断退出标志
			if(strcmp("quit",rbuf) == 0)
			{
				break;
			}
			//将读数据容器输出到终端
			printf("received message from A:%s\n",rbuf);
		}
		//关闭文件描述符
		close(rfd);

	}

	//回收子进程
	waitpid(-1,NULL,WNOHANG);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值