使用消息队列,实现两个终端相互聊天
程序代码:
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;
}