12.8 day6 IO进程线程 作业

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

1.  两个有名管道

#include <myhead.h>
int main(int argc, const char *argv[])
{
	if(mkfifo("myfifo1",0664)==-1)
	{
		perror("myfifo1 error");
		return -1;
	}
	getchar();
	system("rm myfifo1");
	return 0;
}
#include <myhead.h>
int main(int argc, const char *argv[])
{

	if(mkfifo("myfifo",0664)==-1)
	{
		perror("myfifo error");
		return -1;
	}
	getchar();
	system("rm myfifo");

	return 0;
}

2.进程

#include <myhead.h>
int main(int argc, const char *argv[])
{
	pid_t pid1=-1;
	pid1=fork();
	if(pid1>0)
	{
		int wfd1=-1;
		if((wfd1=open("./myfifo",O_WRONLY))==-1)
		{
			perror("wfd1 open error");
			return -1;
		}
		char wa[128]="";
		while(1)
		{
			printf("请输入:");
			fgets(wa,sizeof(wa),stdin);
			wa[strlen(wa)-1]=0;
			write(wfd1,wa,sizeof(wa));
			if(strcmp(wa,"quit")==0)
				break;
		}
		close(wfd1);
		wait(NULL);


	}else if(pid1==0)
	{
		int rfd1=-1;
		if((rfd1=open("./myfifo1",O_RDONLY))==-1)
		{
			perror("rfd1 open error");
			return -1;
		}
		char ra[128]="";
		while(1)
		{
			bzero(ra,sizeof(ra));
			read(rfd1,ra,sizeof(ra));
			printf("收到一条信息:%s",ra);
			fflush(stdout);
			if(strcmp(ra,"quit")==0)
				break;

		}
		close(rfd1);
		exit(0);

	}else
	{
		perror("fork error");
		return -1;
	}
	return 0;
}
#include <myhead.h>
int main(int argc, const char *argv[])
{
	pid_t pid2=-1;
	pid2=fork();
	if(pid2>0)
	{
		int rfd2=-1;
		if((rfd2=open("./myfifo",O_RDONLY))==-1)
		{
			perror("rfd2 open error");
			return -1;
		}
		char ra[128]="";
		while(1)
		{
			bzero(ra,sizeof(ra));
			read(rfd2,ra,sizeof(ra));
			printf("收到一条信息:%s\n",ra);
			if(strcmp(ra,"quit")==0)
				break;
		}
		close(rfd2);
		wait(NULL);


	}else if(pid2==0)
	{
		int wfd2=-1;
		if((wfd2=open("./myfifo1",O_WRONLY))==-1)
		{
			perror("wfd2 open error");
			return -1;
		}
		char wa[128]="";
		while(1)
		{
			printf("请输入:");
			fgets(wa,sizeof(wa),stdin);
			wa[strlen(wa)]=0;
			write(wfd2,wa,sizeof(wa));
			if(strcmp(wa,"quit")==0)
				break;

		}
		close(wfd2);
		exit(0);

	}else
	{
		perror("fork error");
		return -1;
	}
	return 0;
}

效果图:

 使用无名管道实现父子进程之间的通信

#include <myhead.h>
int main(int argc, const char *argv[])
{
	pid_t pid=-1;
	int pipefd[2]={0};
	if(pipe(pipefd)==-1)
	{
		perror("pipe error");
		return -1;
	}

	pid=fork();
	if(pid>0)
	{
		close(pipefd[0]);
		char wa[128]="";
		while(1)
		{
			fgets(wa,sizeof(wa),stdin);
			wa[strlen(wa)-1]=0;
			write(pipefd[1],wa,sizeof(wa));
			if(strcmp(wa,"quit")==0)
				break;
		}
		close(pipefd[1]);
	}else if(pid==0)
	{
		close(pipefd[1]);
		char ra[128]="";
		while(1)
		{
			bzero(ra,sizeof(ra));
			read(pipefd[0],ra,sizeof(ra));
			printf("收到消息=%s\n",ra);
			if(strcmp(ra,"quit")==0)
				break;
		}
		close(pipefd[0]);
	}else
	{
		perror("fork error");
		return -1;
	}
	return 0;
}

效果图

使用标准IO完成拷贝

#include <myhead.h>
int main(int argc, const char *argv[])
{
	FILE *fp;
	FILE *rfp;
	if((fp=fopen("./Text.txt","w"))==NULL)
	{
		perror("fopen error w");
		return -1;
	}
	if((rfp=fopen("./text.txt","w"))==NULL)
	{
		perror("fopen error w");
		return -1;
	}
	char a[128]="aaaaa";
	fwrite(a,strlen(a),1,fp);
	fclose(fp);
	fclose(rfp);
	if((fp=fopen("./Text.txt","r"))==NULL)
	{
		perror("fopen error r");
		return -1;
	}
	if((rfp=fopen("./text.txt","w"))==NULL)
	{
		perror("fopen error w");
		return -1;
	}
	char ra[128]="";
	while(1)
	{
		int res=fread(ra,1,sizeof(ra),fp);
		if(0==res)
			break;
		fwrite(ra,1,res,rfp);
	}
	fclose(fp);
	fclose(rfp);
	return 0;
}

使用文件IO完成拷贝

#include <myhead.h>
int main(int argc, const char *argv[])
{
	int fd=-1;
	int rfd=-1;
	if((fd=open("./Tset.txt",O_RDWR|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("open error r+");
		return -1;
	}
	char a[128]="hello world";
	write(fd,a,strlen(a));
	close(fd);
	if((fd=open("./Tset.txt",O_RDONLY))==-1)
	{
		perror("open error r");
		return -1;
	}
	if((rfd=open("./test.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("open error w");
		return -1;
	}
	char ra[128]="";
	int res=0;
	while((res=read(fd,ra,sizeof(ra)))!=0)
	{
		write(rfd,ra,res);
	}
	close(fd);
	close(rfd);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值