多執行緒+訊息佇列 實現聊天
阿新 • • 發佈:2022-05-16
## 編譯時 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;
}