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

IO编程--两进程间的实时通信

一、使用有名管道实现两个进程之间的相互通信

代码如下:

创建有名管道文件

#include <myhead.h>
int main(int argc, const char *argv[])
{
	if(mkfifo("myfifo",0664)==-1)
	{
		perror("create error");
		return -1;
	}
	if(mkfifo("myfifo_1",0664)==-1)
	{
		perror("create error");
		return -1;
	}
	getchar();
	unlink("myfifo");
	unlink("myfifo_1");
	return 0;
}

进程A通信

#include <myhead.h>
sem_t sem;
void* task(void *arg)
{
	sem_wait(&sem);
//	printf("subthread A\n");
	int rfd=open("myfifo_1",O_RDONLY);
	if(rfd==-1)
	{
		perror("open error");
		return NULL;
	}
	char rbuf[128]="";
	while(1)
	{
		bzero(rbuf,sizeof(rbuf));
		read(rfd,rbuf,sizeof(rbuf));
		printf("\n接收到信息:%s\n",rbuf);
		if(strcmp(rbuf,"bye")==0)
			break;
	}
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	sem_init(&sem,0,0);
	pthread_t tid=-1;
	if(pthread_create(&tid,NULL,task,NULL)!=0)
	{
		printf("create error\n");
		return -1;
	}
	printf("main thread A\n");
	int wfd = open("myfifo",O_WRONLY);
	if(wfd==-1){
		perror("open error");
		return -1;
	}
	//向管道中写入文件
	char wbuf[128]="";
	while(1){
		bzero(wbuf,sizeof(wbuf));
		printf("请输入:");
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf)-1]=0;
		//写入管道
		write(wfd,wbuf,sizeof(wbuf));
		printf("发送成功\n");
		sem_post(&sem);
		if(strcmp(wbuf,"bye")==0)
			break;
	}
	close(wfd);
	pthread_join(tid,NULL);
	sem_destroy(&sem);
	return 0;
}

进程B通信功能

#include <myhead.h>
sem_t sem;
void* task(void *arg)
{
	sem_wait(&sem);
//	printf("subthread\n");
	int wfd=open("myfifo_1",O_WRONLY);
	if(wfd==-1){
		perror("open error");
		return NULL;
	}
	char wbuf[128]="";
	while(1){
		bzero(wbuf,sizeof(wbuf));
		printf("请回答:");
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf)-1]=0;
		write(wfd,wbuf,sizeof(wbuf));
		printf("发送成功\n");
		if(strcmp(wbuf,"bye")==0)
			break;
	}
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	pthread_t tid=-1;
	sem_init(&sem,0,0);
	if(pthread_create(&tid,NULL,task,NULL)!=0)
	{
		printf("create error");
		return -1;
	}
	printf("main thread\n");
	int rfd=open("myfifo",O_RDONLY);
	if(rfd==-1)
	{
		perror("open error");
		return -1;
	}
	char rbuf[128]="";
	while(1){
		bzero(rbuf,sizeof(rbuf));
		read(rfd,rbuf,sizeof(rbuf));
		printf("\n接收到的信息:%s\n",rbuf);
		sem_post(&sem);
		if(strcmp(rbuf,"bye")==0)
			break;
	}
	close(rfd);
	pthread_join(tid,NULL);
	sem_destroy(&sem);
	return 0;
}
二、思维导图 

 


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

相关文章:

  • 6-4.Android 对话框之进度对话框问题清单(UI 线程问题、外部取消、dismiss 方法与 hide 方法)
  • MySQL-21.多表设计-案例-关系分析-表结构
  • 数据结构与算法——Java实现 41.对称二叉树
  • 基于FPGA的信号发生器verilog实现,可以输出方波,脉冲波,m序列以及正弦波,可调整输出信号频率
  • 2024-10-15 问AI: [AI面试题] 人工智能中使用了哪些不同的搜索算法?
  • 《Windows PE》7.3 遍历资源表
  • PostgreSQL学习笔记:PostgreSQL vs MySQL
  • 汽车票在线预订:SpringBoot技术实践
  • 探索程序之道:为什么要开发程序
  • R语言详解predict函数
  • Python 网络爬虫入门与实战
  • [C#][winform]基于yolov8的8种人脸表情检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面
  • copliot竞品——豆包MarsCode
  • YoloV10改进策略:注意力改进|DeBiFormer,可变形双级路由注意力|引入DeBiLevelRoutingAttention注意力模块(全网首发)
  • Java综合项目(day38)
  • 如何挑选可靠的全球HTTP代理?
  • 一、Linux:开源传奇在大数据领域的璀璨绽放
  • c4d渲染和3d渲染有什么区别?c4d和3dmax哪个容易学?
  • 数据结构-5.10.树和森林的遍历
  • K14836 加密通话(call)