使用消息队列实现的2个终端之间的互相聊天 并使用信号控制消息队列的读取方式: 当键盘按ctrl+c的时候,切换消息读取方式,一般情况为读取指定编号的消息,按ctrl+c之后,指定的编号不读取,读取其他所有编号的消息
#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>
int brr=0;
struct msgbuf
{
long mtype;
char mtext[128];
};
void *run(void *arg)
{
int* mytype=(int*)arg;
key_t key=ftok("./ipc",1);
if(key==-1)
{
perror("ftok");
return NULL;
}
int id=msgget(key,IPC_CREAT|0666);
if(id==-1)
{
perror("msgget");
return NULL;
}
struct msgbuf msg;
int size=0;
while(1)
{
if(brr==0)
{
memset(&msg,0,sizeof(msg));
msgrcv(id,&msg,128,*mytype,IPC_NOWAIT);
if(strlen(msg.mtext)!=0)
{
putchar(10);
printf("读取到的消息为:%s\n",msg.mtext);
printf("请输入:");
fflush(stdout);
}
else
{
;
}
}
else if(brr==1)
{
memset(&msg,0,sizeof(msg));
msgrcv(id,&msg,128,*mytype,IPC_NOWAIT|020000);
if(strlen(msg.mtext)!=0)
{
putchar(10);
printf("读取到的消息为:%s\n",msg.mtext);
printf("请输入:");
fflush(stdout);
}
else
{
;
}
}
}
}
void handler(int signum)
{
if(signum==SIGINT)
{
brr=(brr+1)%2;
printf("%d\n",brr);
}
}
int main(int argc, const char *argv[])
{
pthread_t id1;
int mytype1=atoi(argv[2]);
pthread_create(&id1,0,run,&mytype1);
int mytype=atoi(argv[1]);
key_t key=ftok("./ipc",1);
if(key==-1)
{
perror("ftok");
return 1;
}
int id=msgget(key,IPC_CREAT|0666);
if(id==-1)
{
perror("msgget");
return 1;
}
struct msgbuf msg;
int size=0;
signal(SIGINT,handler);
while(1)
{
memset(&msg,0,sizeof(msg));
msg.mtype=mytype;
printf("请输入:");
scanf("%128s",msg.mtext);
while(getchar()!='\n');
size=strlen(msg.mtext);
msgsnd(id,&msg,size,0);
}
return 0;
}
第一个终端读取编号1的输入;编号1 2 3输入只有编号1输出;
当更改编号第1个终端的功能之后,直接输出原先编号2 3 的输入,同时编号1无法继续输入;
思维导图为: