IO—消息队列+管道

使用消息队列实现的2个终端之间的互相聊天

并使用信号控制消息队列的读取方式:

当键盘按ctrl+c的时候,切换消息读取方式,一般情况为读取指定编号的消息,按ctr1+c之后,指定的编号不读取,读取其他所有编号的消息

wftok.c

cs 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
void* run(void* arg);
typedef struct msgp{
	long mtype;
	char mtext[128];
}msgpstr;
int mtype=1;
void handler(int signum);
int main(int argc, const char *argv[])
{
	pthread_t id;
 	int prtval;
 	prtval= pthread_create(&id,0,run,0);
 	if(prtval==-1){
		perror("pthread_create");
     	return 1;
 	}
	signal(SIGINT,handler);
	//创建消息队列秘钥
	key_t frtval=ftok("./ipc_ftok",1);
	if(frtval==-1){
		perror("ftok");
		return 1;
	}
	//访问创建的消息秘钥
	int mrtval=msgget(frtval,IPC_CREAT|0666);
	if(mrtval==-1){
		perror("msgget");
		return 1;
	}
	//写入消息
	msgpstr msg;
	while(1){
		bzero(msg.mtext,128);
		msg.mtype=mtype;//确定消息编号
		puts("A:");
		scanf("%128s",msg.mtext);
		
		while(getchar()!=10);
		int msrtval=msgsnd(mrtval,&msg,128,0);
	}

	
	return 0;
}
void* run(void* arg){
	//创建消息队列秘钥
	key_t frtval=ftok("./ipc_ftok",1);
	if(frtval==-1){
		perror("ftok");
    	return NULL;
	}
	//访问创建的消息秘钥
	int mrtval=msgget(frtval,IPC_CREAT|0666);
	if(mrtval==-1){
		perror("msgget");                      
		return NULL;
	}
	//read
	msgpstr msg;
	while(1){
		bzero(msg.mtext,128);
		msgrcv(mrtval,&msg,128,mtype+1,0);
		printf("B:%s\n",msg.mtext);
	}

}
void handler(int signum){
    if(signum==SIGINT){
        printf("cut number\n");
        mtype=2;
    }
}

rftok.c

cs 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
void* run(void* arg);
typedef struct msgp{
    long mtype;
    char mtext[128];
}msgpstr;
int mtype=1;
void handler(int signum);
int main(int argc, const char *argv[])
{
	pthread_t id;
	int prtval;
	prtval=	pthread_create(&id,0,run,0);
	if(prtval==-1){
		perror("pthread_create");
		return 1;
	}
	signal(SIGINT,handler);
    //创建消息队列秘钥
    key_t frtval=ftok("./ipc_ftok",1);
    if(frtval==-1){
        perror("ftok");
        return 1;
    }
    //访问创建的消息秘钥
    int mrtval=msgget(frtval,IPC_CREAT|0666);
    if(mrtval==-1){
        perror("msgget");
        return 1;
    }
	//read
	msgpstr msg;
	while(1){
		bzero(msg.mtext,128);
		msgrcv(mrtval,&msg,128,mtype,0);
		printf("A:%s\n",msg.mtext);
	}
	return 0;
}
void* run(void* arg){
	//创建消息队列秘钥
	key_t frtval=ftok("./ipc_ftok",1);
	if(frtval==-1){
  	  perror("ftok");
   	 return NULL;
	}
	//访问创建的消息秘钥
	int mrtval=msgget(frtval,IPC_CREAT|0666);
	if(mrtval==-1){
 	   perror("msgget");
 	   return NULL;
	}
	//写入消息
	msgpstr msg;
	while(1){
  	  bzero(msg.mtext,128);
  	  msg.mtype=mtype+1;//确定消息编号
	  puts("B:");
	  scanf("%128s",msg.mtext);
	  while(getchar()!=10);
	  int msrtval=msgsnd(mrtval,&msg,128,0);
	}
}
void handler(int signum){
	if(signum==SIGINT){
		printf("cut number\n");
		mtype=2;
	}
}

运行结果:

相关推荐
小白勇闯网安圈2 小时前
Vmware的Ubuntu构建极简版Linux发行版
linux
刘某的Cloud2 小时前
shell脚本-read-输入
linux·运维·bash·shell·read
broad-sky3 小时前
Ubuntu上查看USB相机连接的是哪个口,如何查看
linux·数码相机·ubuntu
秋深枫叶红3 小时前
嵌入式第三十七篇——linux系统编程——线程控制
linux·学习·线程·系统编程
shaohui9733 小时前
ARMv7 linux中断路由以及处理
linux·gic·cpsr·armv7
三小尛3 小时前
linux的开发工具vim
linux·运维·vim
陈陈爱java3 小时前
Conda 常用命令行
linux·windows·conda
twdnote3 小时前
dokcer 环境中集成LibreOffice
linux
ChristXlx3 小时前
Linux安装redis(虚拟机适用)
linux·运维·redis
源文雨3 小时前
PVE实现USB硬盘盒在备份前自动上电/结束后自动断电脚本
linux·运维·服务器·备份·perl·pve·usb硬盘盒