IO和进程day07(IPC、管道、信号)

今日任务

IO和进程day07(IPC、管道、信号)_第1张图片

1.代码(一次只能发一次消息,不然会存在一些小问题,在接受消息之后会立刻输出上次的第二次发送的消息)

read.c文件(先读取消息)

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
int main(int argc, const char *argv[])
{
	//创建打开第一个管道文件
	if(-1==mkfifo("./fifo1",0664)){
		if(17!=errno){
			perror("mkfifo1");
			return -1;
		}
	}
	puts("create pipe1 success");
	//打开管道文件
	int fd1=open("./fifo1",O_RDONLY);
	if(-1==fd1){
		perror("open1");
		return -1;
	}
	puts("open1 success");
	//创建打开第二个管道文件
	if(-1==mkfifo("./fifo2",0664)){
		if(17!=errno){
			perror("mkfifo2");
			return -1;
		}
	}
	puts("create pipe2 success");
	//打开管道文件
	int fd2=open("./fifo2",O_WRONLY);
	if(-1==fd2){
		perror("open2");
		return -1;
	}
	puts("open2 success");
	//读  写
	char buf1[128];
	char buf2[128];
	while(1){
		//读
		bzero(buf1,sizeof(buf1));
		int res=read(fd1,buf1,sizeof(buf1));
		if(res<0){
			perror("read");
			return -1;
		}else if(res==0){
			break;
		}else{
			printf("jack:%s\n",buf1);
			//fprintf(stdout,"jack:%s\n",buf1);
		}
		//写
		bzero(buf2,sizeof(buf2));
		//scanf("%s",buf2);
		fgets(buf2,sizeof(buf2),stdin);
		buf2[strlen(buf2)-1]='\0';
		if(strcmp(buf2,"quit")==0)
			break;
		if(-1==write(fd2,buf2,sizeof(buf2))){
			perror("write");
			return -1;
		}

	}

	//关闭
	close(fd1);
	close(fd2);
	return 0;
}

write.c文件(先发送消息的)

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
int main(int argc, const char *argv[])
{
	//创建打开第一个管道文件
	if(-1==mkfifo("./fifo1",0664)){
		if(17!=errno){
			perror("mkfifo1");
			return -1;
		}
	}
	puts("create pipe1 success");
	//打开管道文件
	int fd1=open("./fifo1",O_WRONLY);
	if(-1==fd1){
		perror("open1");
		return -1;
	}
	puts("open1 success");
	//创建打开第二个管道文件
	if(-1==mkfifo("./fifo2",0664)){
		if(17!=errno){
			perror("mkfifo2");
			return -1;
		}
	}
	puts("create pipe2 success");
	//打开管道文件
	int fd2=open("./fifo2",O_RDONLY);
	if(-1==fd2){
		perror("open2");
		return -1;
	}
	puts("open2 success");
	
	char buf1[128];
	char buf2[128];
	while(1){
		//写
		bzero(buf1,sizeof(buf1));
		//scanf("%s",buf1);
		fgets(buf1,sizeof(buf1),stdin);
		buf1[strlen(buf1)-1]='\0';
		if(strcmp(buf1,"quit")==0)
			break;
		if(-1==write(fd1,buf1,sizeof(buf1))){
			perror("write");
			return -1;
		}
		//读
		bzero(buf2,sizeof(buf2));
		int res=read(fd2,buf2,sizeof(buf2));
		if(res<0){
			perror("read");
			return -1;
		}else if(res==0){
			break;
		}else{
			printf("rose:%s\n",buf2);
			//fprintf(stdout,"rose:%s\n",buf2);
		}
	}

	//关闭
	close(fd1);
	close(fd2);
	return 0;
}

运行结果

IO和进程day07(IPC、管道、信号)_第2张图片

2.代码(就是把代码1分别放到线程中就可以了,)

jack.c文件

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


//线程1:读取
void * fun1(void*arg){
	//创建打开第一个管道文件
	if(-1==mkfifo("./fifo1",0664)){
		if(17!=errno){
			perror("mkfifo1");
			return NULL;
		}
	}
	puts("create pipe1 success");
	//打开管道文件
	int fd1=open("./fifo1",O_WRONLY);
	if(-1==fd1){
		perror("open1");
		return NULL;
	}
	puts("open1 success");
	char buf1[128];
	while(1){

		//写
		bzero(buf1,sizeof(buf1));
		//scanf("%s",buf1);
		fgets(buf1,sizeof(buf1),stdin);
		buf1[strlen(buf1)-1]='\0';
		if(strcmp(buf1,"quit")==0)
			break;
		if(-1==write(fd1,buf1,sizeof(buf1))){
			perror("write");
			return NULL;
		}

	}

	close(fd1);
	pthread_exit(NULL);
}
//线程2:写出
void * fun2(void*arg){
	//创建打开第二个管道文件
	if(-1==mkfifo("./fifo2",0664)){
		if(17!=errno){
			perror("mkfifo2");
			return NULL;
		}
	}
	puts("create pipe2 success");
	//打开管道文件
	int fd2=open("./fifo2",O_RDONLY);
	if(-1==fd2){
		perror("open2");
		return NULL;
	}
	puts("open2 success");

	char buf2[128];
	while(1){

		//读
		bzero(buf2,sizeof(buf2));
		int res=read(fd2,buf2,sizeof(buf2));
		if(res<0){
			perror("read");
			return NULL;
		}else if(res==0){
			break;
		}else{
			printf("rose:%s\n",buf2);
			//fprintf(stdout,"rose:%s\n",buf2);
		}

	}

	close(fd2);
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	//创建线程
	pthread_t th1,th2;
	if(0!=pthread_create(&th1,NULL,fun1,NULL)){
		puts("th1 create failed");
		return -1;
	}
	if(0!=pthread_create(&th2,NULL,fun2,NULL)){
		puts("th2 create failed");
		return -1;
	}

	pthread_join(th1,NULL);
	pthread_join(th2,NULL);
	return 0;
}

rose文件

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
//线程1:写出
void * fun1(void* arg){
	//创建打开第一个管道文件
	if(-1==mkfifo("./fifo1",0664)){
		if(17!=errno){
			perror("mkfifo1");
			return NULL;
		}
	}
	puts("create pipe1 success");
	//打开管道文件
	int fd1=open("./fifo1",O_RDONLY);
	if(-1==fd1){
		perror("open1");
		return NULL;
	}
	puts("open1 success");
	char buf1[128];
	while(1){

	//读
		bzero(buf1,sizeof(buf1));
		int res=read(fd1,buf1,sizeof(buf1));
		if(res<0){
			perror("read");
			return NULL;
		}else if(res==0){
			break;
		}else{
			printf("jack:%s\n",buf1);
			//fprintf(stdout,"jack:%s\n",buf1);
		}


	}
	
	close(fd1);
	pthread_exit(NULL);
}
//线程2:读取
void *fun2(void* arg){
	//创建打开第二个管道文件
	if(-1==mkfifo("./fifo2",0664)){
		if(17!=errno){
			perror("mkfifo2");
			return NULL;
		}
	}
	puts("create pipe2 success");
	//打开管道文件
	int fd2=open("./fifo2",O_WRONLY);
	if(-1==fd2){
		perror("open2");
		return NULL;
	}
	puts("open2 success");
	char buf2[128];
	while(1){
			//写
		bzero(buf2,sizeof(buf2));
		//scanf("%s",buf2);
		fgets(buf2,sizeof(buf2),stdin);
		buf2[strlen(buf2)-1]='\0';
		if(strcmp(buf2,"quit")==0)
			break;
		if(-1==write(fd2,buf2,sizeof(buf2))){
			perror("write");
			return NULL;
		}

	}

	close(fd2);
	pthread_exit(NULL);
	
}
int main(int argc, const char *argv[])
{
	//创建线程
	pthread_t th1,th2;
	if(0!=pthread_create(&th1,NULL,fun1,NULL)){
		puts("th1 create failed");
		return -1;
	}
	if(0!=pthread_create(&th2,NULL,fun2,NULL)){
		puts("th2 create failed");
		return -1;
	}

	pthread_join(th1,NULL);
	pthread_join(th2,NULL);
	return 0;
}

运行结果

IO和进程day07(IPC、管道、信号)_第3张图片

今日思维导图

to be honest,sometime my brain is shutdown .

你可能感兴趣的:(c语言)