1.23 消息队列
使用消息队列,实现两个终端相互聊天
程序代码:
w1.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.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>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t; key_t key;
int id;
typedef struct msg
{long channel; char buf[64];
}msg_t;void msg_snd()
{msg_t arr;while(1){arr.channel = 1; printf("请输入:");scanf("%s",arr.buf);msgsnd(id,&arr,strlen(arr.buf),0);}
}void msg_rcv()
{int flag;msg_t arr;while(1){flag = msgrcv(id,&arr,sizeof(arr.buf),2,0);if(flag != -1)printf("\b\b\b\b\b\b\b\b收到的消息为:%s\n",arr.buf);memset(arr.buf,0,sizeof(arr.buf));}
}void handler(int signum)
{if(SIGINT == signum) {msgctl(id,IPC_RMID,NULL);exit(0);}
}
void* pthread_main(void* arg)
{msg_snd();
}int main(int argc, const char *argv[])
{pthread_t pthread_id;signal(SIGINT,handler);key = ftok("1.txt",1);if(key == -1){perror("ftok");}id = msgget(key,IPC_CREAT|0664);pthread_create(&pthread_id,0,pthread_main,NULL);pthread_detach(pthread_id);msg_rcv();return 0;
}
w2.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.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>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t; key_t key;
int id;
typedef struct msg_data
{long channel;char buf[64];
}msg_t;
void msg_snd()
{msg_t arr;while(1){arr.channel = 2;printf("请输入:");scanf("%s",arr.buf);msgsnd(id,&arr,strlen(arr.buf),0);}
}void msg_rcv()
{int flag;msg_t arr;while(1){flag = msgrcv(id,&arr,sizeof(arr.buf),1,0);if(flag != -1)printf("\b\b\b\b\b\b\b\b收到的消息为:%s\n",arr.buf);memset(arr.buf,0,sizeof(arr.buf));}
}
void handler(int signum)
{if(SIGINT == signum){msgctl(id,IPC_RMID,NULL);exit(0);}
}
void* pthread_main(void* arg)
{msg_snd();
}
int main(int argc, const char *argv[])
{pthread_t pthread_id;signal(SIGINT,handler);key = ftok("1.txt",1);if(key == -1){perror("ftok");}id = msgget(key,IPC_CREAT|0664);pthread_create(&pthread_id,0,pthread_main,NULL);pthread_detach(pthread_id);msg_rcv();return 0;
}