IO 进程间通信

第一题

现在有2个.c 文件 1.c负责输入2个非0数,a 和 b 2.c负责找出 a 到 b 之间的所有质数 要求使用无名管道实现

int main(int argc, const char *argv[])
{
	int arr[2];
	int res=pipe(arr);
	if(res==-1){
		perror("pipe");
		return 1;
	}
	res=fork();
	if(res>0){
		close(arr[0]);
		while(1){
			double buf[2]={0};
			printf("输入数据:");
			scanf("%lf %lf",buf,buf+1);
			while(getchar()!=10);
			write(arr[1],buf,16);
			usleep(1000);
		}
	}else{
		execl("./02","02",NULL);
	}
	return 0;
}
int main(int argc, const char *argv[])
{
	close(4);
	while(1){
		double buf[2]={0};
		read(3,buf,16);
		int a=(int)buf[0];
		int b=(int)buf[1];
		int i=0;
		int j=0;
		for(i=a;i<b;i++){
			for(j=2;j<i;j++){
				if(i%j==0){	break;}
			}
			if(i==j){
				printf("%d ",i);
			}
		}
		printf("\n");
	}
	return 0;
}

 第二题

创建一对父子 父进程负责输入一串字符串 子进程负责判断这串字符串是否为回文字符串

int main(int argc, const char *argv[])
{
	int arr[2]={0};
	int res=pipe(arr);
	if(res==-1){
		perror("pipe");
		return 1;
	}
	res=fork();
	if(res>0){
		close(arr[0]);
		while(1){
			char val[100];
			printf("输入数据:");
			scanf("%s",val);
			write(arr[1],val,sizeof(val));
			usleep(1000);
		}
	}else if(res==0){
		close(arr[1]);
		while(1){
			char val[100];
			read(arr[0],val,sizeof(val));
			int i=0;
			int j=strlen(val)-1;
			while(i<=j&&val[i]==val[j]){
				i++;
				j--;
			}
			if(i>j){
				printf("%s是回文数\n",val);
			}else{
				printf("%s不是回文数\n",val);
			}
		}
	}
	return 0;
}

 

第四题 

使用有名管道,实现2个进程之间的互相聊天 注意:一定是一方可以一直发消息,另一方不回消息,或者在任意时间随意回复几条消息。千万不能是一方发送消息后,去等待另一方的回复后才能发送另一条消息

int main(int argc, const char *argv[])
{
	if(access("./zyfifo1",F_OK)==-1){
		mkfifo("./myfifo1",0666);
	}
	if(access("./zyfifo2",F_OK)==-1){
		mkfifo("./myfifo2",0666);
	}
	int fd1=open("./myfifo1",O_WRONLY|O_TRUNC);
	int fd2=open("./myfifo2",O_RDONLY);
	printf("管道文件打开成功\n");
	int res=fork();
	if(res==0){
		while(1){
			char buf[64]={0};
			scanf("%64s",buf);
			while(getchar()!=10);
			write(fd1,buf,strlen(buf));
		}
	}else{
		while(1){
			char buf[64]={0};
			read(fd2,buf,64);
			printf("%s\n",buf);
		}
	}
	close(fd1);
	close(fd2);
	return 0;
}
int main(int argc, const char *argv[])
{
	if(access("./zyfifo1",F_OK)==-1){
		mkfifo("./myfifo1",0666);
	}
	if(access("./zyfifo2",F_OK)==-1){
		mkfifo("./myfifo2",0666);
	}
	int fd1=open("./myfifo1",O_RDONLY);
	int fd2=open("./myfifo2",O_WRONLY|O_TRUNC);
	printf("管道文件打开成功\n");
	int res=fork();
	if(res==0){
		while(1){
			char buf[64]={0};
			read(fd1,buf,64);
			printf("%s\n",buf);
		}
	}else{
		while(1){
			char buf[64]={0};
			scanf("%64s",buf);
			while(getchar()!=10);
			write(fd2,buf,strlen(buf));
		}
	}
	close(fd1);
	close(fd2);
	return 0;
}

 

 

 

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值