使用消息队列实现的2个终端之间的互相聊天
并使用信号控制消息队列的读取方式:
当键盘按ctrl+c的时候,切换消息读取方式,一般情况为读取指定编号的消息,按ctrl+c之后,指定的编号不读取,读取其他所有编号的消息
send.c
typedef struct msgbuf {
long type;
char buf[128];
} msgbuf,p_msgbuf;
int msgflg = 0;
void handler(int signum)
{
if(signum == SIGINT){
if(msgflg == 0){
msgflg = 020000;
}else if(msgflg == 020000){
msgflg = 0;
}
}else if(signum == SIGTSTP){
exit(0);
}
}
int main(int argc, const char *argv[])
{
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 2;
}
int retval = fork();
if(retval > 0){
msgbuf msg;
while(1){
signal(SIGINT,handler);
memset(&msg,0,sizeof(msg));
msgrcv(id,&msg,128,2,msgflg);
printf("output:%s\n",msg.buf);
}
}else if(retval == 0){
msgbuf msg;
int size = 0;
while(1){
memset(&msg,0,sizeof(msg));
msg.type = 1;
scanf("%128s",msg.buf);
while(getchar() != '\n');
size = strlen(msg.buf);
msgsnd(id,&msg,size,0);
}
}else{
perror("fork");
return 3;
}
return 0;
}
receive.c
typedef struct msgbuf {
long type;
char buf[128];
} msgbuf,p_msgbuf;
int msgflg = 0;
void handler(int signum)
{
if(signum == SIGINT){
if(msgflg == 0){
msgflg = 020000;
}else if(signum == 020000){
msgflg = 0;
}
}else if(signum == SIGTSTP){
exit(0);
}
}
int main(int argc, const char *argv[])
{
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 2;
}
int retval = fork();
if(retval > 0){
msgbuf msg;
while(1){
signal(SIGINT,handler);
memset(&msg,0,sizeof(msg));
msgrcv(id,&msg,128,1,msgflg);
printf("output:%s\n",msg.buf);
}
}else if(retval == 0){
msgbuf msg;
int size = 0;
while(1){
memset(&msg,0,sizeof(msg));
msg.type = 2;
scanf("%128s",msg.buf);
while(getchar() != '\n');
size = strlen(msg.buf);
msgsnd(id,&msg,size,0);
}
}else{
perror("fork");
return 3;
}
return 0;
}