day 8 进程间通信管道

1.1.要求实现AB进程对话
A进程先发送一句话给B进程,B进程接收后打印
B进程再回复一句话给A进程,A进程接收后打印
重复1.2步骤,当收到quit后,要结束AB进程
提示:两根管道

A进程代码

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<pthread.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>

void *callback_wirte(void *arg)
{
	int fd=*(int*)arg;
	char buf[128]="";
	while(1)
	{
		//写
		printf("请输入发送内容>>>");
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1]=0;

		if(write(fd,buf,sizeof(buf))<0)
		{
			perror("write");
			return NULL;
		}
		if(strcasecmp(buf,"quit")==0)
			break;
		printf("写入成功\n");
	}
	pthread_exit(NULL);
}
void *callback_read(void *arg)
{

	int fd2=*(int*)arg;
	char buf2[128]="";
	while(1)
	{
		//读
		bzero(buf2,sizeof(buf2));
		size_t res=read(fd2,buf2,sizeof(buf2));
		if(res<0)
		{
			perror("read");
			return NULL;
		}
		else if(0==res)
		{
			printf("写端退出\n");
			break;
		}
		printf("\n对方发送:");
		printf("%s\n",buf2);
		if(strcasecmp(buf2,"quit")==0)
		{
			printf("A线程read已退出\n");
			exit(0);
		}
	}
	pthread_exit(NULL);
}


int main(int argc, const char *argv[])
{
	umask(0);

	//创建有名管道
	if(mkfifo("./fifo",0664)<0)
	{
		if(17!=errno)
		{
			perror("mkfifo");
			return -1;
		}
	}
	if(mkfifo("./fifo2",0664)<0)
	{
		if(17!=errno)
		{
			perror("mkfifo");
			return -1;
		}
	}

	//打开第一个管道文件
	int fd=open("./fifo",O_WRONLY);
	if(fd<0)
	{
		perror("open");
		return -1;
	}
	printf("第一个管道打开成功!\n");
	//打开第二个管道文件
	int fd2=open("./fifo2",O_RDONLY);
	if(fd2<0)
	{
		perror("open");
		return -1;
	}
	printf("第二个管道文件打开成功\n");

	//创建线程
	pthread_t tid1,tid2;
	if(pthread_create(&tid1,NULL,callback_wirte,&fd)!=0)
	{
		fprintf(stderr,"pthread tid1 create success!\n");
		return -1;
	}
	if(pthread_create(&tid2,NULL,callback_read,&fd2)!=0)
	{
		fprintf(stderr,"pthread tid1 create success!\n");
		return -1;
	}


	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	close(fd);
	close(fd2);

	return 0;
}

 b进程代码:

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<pthread.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>

void *callback_wirte(void *arg)
{
	int fd=*(int*)arg;
	char buf[128]="";
	while(1)
	{
		//写
		printf("请输入发送内容>>>");
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1]=0;

		if(write(fd,buf,sizeof(buf))<0)
		{
			perror("write");
			return NULL;
		}
		if(strcasecmp(buf,"quit")==0)
			break;
		printf("写入成功\n");
	}
	pthread_exit(NULL);
}
void *callback_read(void *arg)
{

	int fd2=*(int*)arg;
	char buf[128]="";
	while(1)
	{
		//读
		bzero(buf,sizeof(buf));
		size_t res=read(fd2,buf,sizeof(buf));
		if(res<0)
		{
			perror("read");
			return NULL;
		}
		else if(0==res)
		{
			printf("写端退出\n");
			pthread_exit(NULL);
		}
		printf("\n对方发送:");
		printf("%s\n",buf);
		if(strcasecmp(buf,"quit")==0)
		{
			printf("B线程read已退出\n");
			//	break;
			exit(0);
		}
	}
}


int main(int argc, const char *argv[])
{
	umask(0);

	//创建有名管道
	if(mkfifo("./fifo",0664)<0)
	{
		if(17!=errno)
		{
			perror("mkfifo");
			return -1;
		}
	}
	if(mkfifo("./fifo2",0664)<0)
	{
		if(17!=errno)
		{
			perror("mkfifo");
			return -1;
		}
	}

	//打开第一个管道文件
	int fd=open("./fifo",O_RDONLY);
	if(fd<0)
	{
		perror("open");
		return -1;
	}
	printf("第一个管道打开成功!\n");
	//打开第二个管道文件
	int fd2=open("./fifo2",O_WRONLY);
	if(fd2<0)
	{
		perror("open");
		return -1;
	}
	printf("第二个管道文件打开成功\n");

	//创建线程
	pthread_t tid1,tid2;
	if(pthread_create(&tid1,NULL,callback_read,&fd)!=0)
	{
		fprintf(stderr,"pthread tid1 create success!\n");
		return -1;
	}
	if(pthread_create(&tid2,NULL,callback_wirte,&fd2)!=0)
	{
		fprintf(stderr,"pthread tid1 create success!\n");
		return -1;
	}


	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	close(fd);
	close(fd2);

	return 0;
}

 2.捕获2 3 20号信号

#include<stdio.h>
#include<unistd.h>
#include<signal.h>

void handler(int sig)
{
	printf("触发sig=%d信号\n",sig);
}
int main(int argc, const char *argv[])
{
	//捕获2) SIGINT,注册新的处理函数
	__sighandler_t s=signal(2,handler);
	if(SIG_ERR == s)
	{
		perror("singnal");
		return -1;
	}

	//捕获3)
	__sighandler_t s3=signal(3,handler);
	if(SIG_ERR == s3)
	{
		perror("singnal");
		return -1;
	}

	//捕获20)
	__sighandler_t s20=signal(20,handler);
	if(SIG_ERR == s20)
	{
		perror("singnal");
		return -1;
	}
	while(1)
	{
		printf("singnal....\n");
		sleep(1);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值