22081-10-18 IO进程线程

1、AB进程能够随时收发形式 (提示:用多线程,多进程)

//程序1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
char buf1[128]="";
char buf2[128]="";
ssize_t ret;
void *callback1(void *arg)
{
	//只写方式打开管道1
	int fd1=open("./fifo1",O_WRONLY);
	if(fd1<0)
	{
			perror("open1");
			return NULL;
	}


	//在管道1写入数据
	while(1)
	{
	//	printf("请进程1输入:");
		fgets(buf1,sizeof(buf1),stdin);
		buf1[strlen(buf1)-1]='\0';

		ret=write(fd1,buf1,sizeof(buf1));
		if(ret<0)
		{
			perror("write");
			return NULL;
		}

	}
	
}
void *callback2(void *arg)
{
	//打开管道2
	int fd2=open("./fifo2",O_RDONLY);
	if(fd2<0)
	{
		perror("open2");
		return NULL;
	}
	//从管道2读取数据
	while(1)
	{
		bzero(buf2,sizeof(buf2));
		ret=read(fd2,buf2,sizeof(buf2));
		if(ret<0)
		{
			perror("read");
			return NULL;
		}
		printf("%s\n",buf2);
	}
	
}
int main(int argc, const char *argv[])
{
	//创建管道1
	umask(0);
	if(mkfifo("./fifo1",0777)<0)
		{
			if(17!=errno)
			{
				perror("mkfifo1");
				return -1;
			}
		}
	//创建管道2
	umask(0);
	if(mkfifo("./fifo2",0777)<0)
	{
		if(17!=errno)
		{
			perror("mkfifo2");
			return -1;
		}
	}
	//创建线程1
	pthread_t pid1;
	if(pthread_create(&pid1,NULL,callback1,NULL)<0)
	{
		perror("pthread_create1");
		return -1;
	}
	//创建线程2
	pthread_t pid2;
	if(pthread_create(&pid2,NULL,callback2,NULL)<0)
	{
		perror("pthread_create2");
		return -1;
	}
	//阻塞
	pthread_join(pid1,NULL);
	pthread_join(pid2,NULL);
	
	
	return 0;
}
//程序2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
char buf1[128]="";
char buf2[128]="";
ssize_t ret;
void *callback1(void *arg)
{
	//只读方式打开管道1
	int fd1=open("./fifo1",O_RDONLY);
	if(fd1<0)
	{
			perror("open1");
			return NULL;
	}


	//从管道1读取数据
	while(1)
	{
		bzero(buf1,sizeof(buf1));
		ret=read(fd1,buf1,sizeof(buf1));
		if(ret<0)
		{
			perror("read");
			return NULL;
		}
		printf("%s\n",buf1);

	}
	
}
void *callback2(void *arg)
{
	//只写打开管道2
	int fd2=open("./fifo2",O_WRONLY);
	if(fd2<0)
	{
		perror("open");
		return NULL;
	}
	//从管道2写入数据
	while(1)
	{
        bzero(buf2,sizeof(buf2));
		fgets(buf2,sizeof(buf2),stdin);
		buf2[strlen(buf2)-1]='\0';

		ret=write(fd2,buf2,sizeof(buf2));
		if(ret<0)
		{
			perror("write");
			return NULL;
		}
	}
	
}
int main(int argc, const char *argv[])
{
	//创建管道1
	umask(0);
	if(mkfifo("./fifo1",0777)<0)
		{
			if(17!=errno)
			{
				perror("mkfifo1");
				return -1;
			}
		}
	//创建管道2
	umask(0);
	if(mkfifo("./fifo2",0777)<0)
	{
		if(17!=errno)
		{
			perror("mkfifo2");
			return -1;
		}
	}
	//创建线程1
	pthread_t pid1;
	if(pthread_create(&pid1,NULL,callback1,NULL)<0)
	{
		perror("pthread_create1");
		return -1;
	}
	//创建线程2
	pthread_t pid2;
	if(pthread_create(&pid2,NULL,callback2,NULL)<0)
	{
		perror("pthread_create2");
		return -1;
	}
	//阻塞
	pthread_join(pid1,NULL);
	pthread_join(pid2,NULL);
	
	
	return 0;
}

​​​​​​​

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值