多线程+消息队列 实现聊天

## 编译时 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; }

 

posted @ 2022-05-16 09:40  孤走  阅读(93)  评论(0编辑  收藏  举报