使用消息队列实现的2个终端之间的互相聊天
并使用信号控制消息队列的读取方式:
当键盘按ctrl+c的时候,切换消息读取方式,一般情况为读取指定编号的消息,按ctr1+c之后,指定的编号不读取,读取其他所有编号的消息
wftok.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>
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;}//readmsgpstr 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
#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;}//readmsgpstr 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;}
}
运行结果: