1. 程式人生 > 其它 >多執行緒+訊息佇列 實現聊天

多執行緒+訊息佇列 實現聊天

## 編譯時 gcc xx.c -o xx -pthread
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdlib.h>
#include <sys/msg.h>
#include <string.h>
#include <pthread.h>

struct msgbuf {
    long mtype;       /* message type, must be > 0 */     //8
    char
mtext[100]; /* message data */ //可以 為所欲為 100 }; int msqid; void *readMsg(void *arg) { struct msgbuf sm; int ret; while(1){ bzero(sm.mtext,sizeof(sm.mtext)); ret= msgrcv(msqid,&sm,sizeof(struct msgbuf)-sizeof(long),1,0); if(ret<0){ perror("msgrcv error
"); exit(-1); } printf("yy:%s\n",sm.mtext); } return NULL; } int main(void) { key_t key = ftok("../xx.c",5); if(key<0){ perror("ftok error"); exit(-1); } printf("key:%#x\n",key); // 建立或者獲取訊息佇列 msqid = msgget(key,IPC_CREAT|0666
); if(msqid<0){ perror("msgget error"); exit(-1); } printf("msqid:%d\n",msqid); /* 執行緒 */ pthread_t thread; if(pthread_create(&thread,NULL,readMsg,NULL)){ perror("pthread_create error"); exit(-1); } if(pthread_detach(thread)){ perror("pthread_detach error"); exit(-1); } /* 寫入資料 */ struct msgbuf sm; sm.mtype =2; int ret; while(1){ bzero(sm.mtext,sizeof(sm.mtext)); scanf("%s",sm.mtext); ret = msgsnd(msqid,&sm,sizeof(struct msgbuf)-sizeof(long),0); if(ret<0){ perror("msgsnd error"); exit(-1); } } return 0; }
## 編譯時 gcc xx.c -o xx -pthread

#include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <stdlib.h> #include <sys/msg.h> #include <string.h> #include <pthread.h> struct msgbuf { long mtype; /* message type, must be > 0 */ //8 char mtext[100]; /* message data */ //可以 為所欲為 100 }; int msqid; void *readMsg(void *arg) { struct msgbuf sm; int ret; while(1){ bzero(sm.mtext,sizeof(sm.mtext)); ret= msgrcv(msqid,&sm,sizeof(struct msgbuf)-sizeof(long),2,0); if(ret<0){ perror("msgrcv error"); exit(-1); } printf("ls:%s\n",sm.mtext); } return NULL; } int main(void) { key_t key = ftok("../xx.c",5); if(key<0){ perror("ftok error"); exit(-1); } printf("key:%#x\n",key); // 建立或者獲取訊息佇列 msqid = msgget(key,IPC_CREAT|0666); if(msqid<0){ perror("msgget error"); exit(-1); } printf("msqid:%d\n",msqid); /* 執行緒 */ pthread_t thread; if(pthread_create(&thread,NULL,readMsg,NULL)){ perror("pthread_create error"); exit(-1); } if(pthread_detach(thread)){ perror("pthread_detach error"); exit(-1); } /* 寫入資料 */ struct msgbuf sm; sm.mtype =1; int ret; while(1){ bzero(sm.mtext,sizeof(sm.mtext)); scanf("%s",sm.mtext); ret = msgsnd(msqid,&sm,sizeof(struct msgbuf)-sizeof(long),0); if(ret<0){ perror("msgsnd error"); exit(-1); } } return 0; }