当前位置: 首页 > article >正文

多进程多线程之间相互通信

管道符创建文件myfifo.c

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

	getchar();

	//删除管道
	unlink("mkfifo1");
	unlink("mkfifo2");

	return 0;
}

 用户一res.c

#include <myhead.h>
void *task1(void *arg)
{
	int wfd1 = open("./mkfifo2",O_WRONLY);
	if(wfd1 == -1)
	{
		perror("打开写文件失败!");

	return NULL;
	}

	char wbuf[20]="";

	while(1)
	{
	//写文件
	printf("请输入>>>");
	fgets(wbuf,sizeof(wbuf),stdin);
	wbuf[strlen(wbuf)-1] = '\0'; //将最后的回车换成字符串结束符

	write(wfd1,wbuf,strlen(wbuf));

	printf("发送成功!\n");
	if(strcmp(wbuf,"quit")== 0)
	{
		break;
	}


	}
	close(wfd1);
	pthread_exit(NULL);
	return NULL;
}

void* task2(void* arg)
{
	int rfd2 = open("./mkfifo1",O_RDONLY);
	if(rfd2 == -1)
	{
		perror("打开读文件失败!");
		return NULL;
	}
	char rbuf[20]="";
	while(1)
	{
		bzero(rbuf,sizeof(rbuf)); //清空数组

		read(rfd2,rbuf,sizeof(rbuf));

		printf("收到消息为:%s\n",rbuf);
		if(strcmp(rbuf,"quit")== 0)
		{
			break;
		}
	}
	close(rfd2);
	pthread_exit(NULL);

	return NULL;

}
int main(int argc, const char *argv[])
{
	//启动多个线程
	pthread_t tid1,tid2;
	//创建多线程
	
	if(pthread_create(&tid1,NULL,task1,NULL) == 1)
	{
		printf("创建失败!\n");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL) == 1)
	{
		printf("创建失败!\n");
		return -1;
	}

	//等待线程结束
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);

	return 0;
}

用户二sen.c 

#include <myhead.h>
void *task1(void *arg)
{
	int wfd1 = open("./mkfifo1",O_WRONLY);
	if(wfd1 == -1)
	{
		perror("打开写文件失败!");
	}


	char wbuf[20]="";

	while(1)
	{
	//写文件
	printf("请输入>>>");
	fgets(wbuf,sizeof(wbuf),stdin);
	wbuf[strlen(wbuf)-1] = '\0'; //将最后的回车换成字符串结束符

	write(wfd1,wbuf,strlen(wbuf));

	printf("发送成功!\n");
	if(strcmp(wbuf,"quit")== 0)
	{
		break;
	}


	}
	close(wfd1);
	pthread_exit(NULL);
}

void* task2(void* arg)
{
	int rfd2 = open("./mkfifo2",O_RDONLY);
	if(rfd2 == -1)
	{
		perror("打开读文件失败!");
	}
	char rbuf[20]="";
	while(1)
	{
		bzero(rbuf,sizeof(rbuf)); //清空数组

		read(rfd2,rbuf,sizeof(rbuf));

		printf("收到消息为:%s\n",rbuf);
		if(strcmp(rbuf,"quit")== 0)
		{
			break;
		}
	}
	close(rfd2);
	pthread_exit(NULL);

}
int main(int argc, const char *argv[])
{
	//启动多个线程
	pthread_t tid1,tid2;
	//创建多线程
	if(pthread_create(&tid1,NULL,task1,NULL) == 1)
	{
		printf("创建失败!\n");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL) == 1)
	{
		printf("创建失败!\n");
		return -1;
	}

	//等待线程结束
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);

	return 0;
}

调试界面


http://www.kler.cn/news/358651.html

相关文章:

  • JavaScript 第13章:Ajax 与异步请求
  • chat_gpt回答:python获取当前utc时间,将xml里时间tag里的值修改为当前时间
  • 上位机开发常用技术 C# Task 线程 开始,暂停,继续,停止
  • Flutter Container组件
  • Javascript 脚本查找B站限时免费番剧
  • 对“一个中心,三重防护”中安全管理中心的理解
  • jmeter 从多个固定字符串中随机取一个值的方法
  • ABAQUS应用11——支座弹簧
  • HTML3D旋转相册
  • vue3 在store的index.js
  • scala 类的继承
  • 2009年国赛高教杯数学建模A题制动器试验台的控制方法分析解题全过程文档及程序
  • 在Windows下使用MFC/Win32 API进行文件夹内所有文件的复制操作,可以通过遍历目录中的文件并逐个复制来实现
  • Android Studio 的 Gradle 任务列表只显示测试任务
  • 51单片机应用开发---外部中断(按键为例)
  • adminPage-vue3依赖 v1.2.0新增组件 DetailsModule说明文档
  • SOC启动
  • Dockerfile 中,把多个 RUN 合并在一起,能减少镜像尺寸吗?
  • 室内定位论文整理-20241016
  • 考拉悠然CEO沈复民受邀出席人工智能建议提案办理座谈会并发言