1. 程式人生 > >Linux:使用多執行緒程式設計和訊息佇列,實現兩個程序之間的聊天

Linux:使用多執行緒程式設計和訊息佇列,實現兩個程序之間的聊天

思路:

一個檔案:建立一個執行緒和主函式,或者建立兩個執行緒主函式呼叫(我用這種)。

建立兩個訊息佇列,

一共兩個檔案,兩個佇列,四個程序

a.c    一個程序寫(訊息型別為1)   ---->>佇列     一個程序讀(訊息型別為2)

b.c   一個程序寫(訊息型別為2)   ---->>佇列     一個程序讀(訊息型別為1)

a.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>

struct MSG{
    long mtype;//訊息型別
    char buf[100];//訊息資料
};

struct MSG_read{
    long mtype_read;//訊息型別
    char buf_read[100];//訊息資料
};


void *write1(void *arg)
{

	   //1.獲取key
    key_t key = ftok("/",'a');
    if(key==-1)
    {
        perror("ftok");
        exit(-1);
    }


     int msqid = msgget(key,IPC_CREAT|0666);       //2.通過key建立訊息佇列
    if(msqid==-1)
    {
        perror("msgget");
        exit(-2);
    }

        //3.傳送訊息
    struct MSG msg1;
    
    while(1)
    {
    	msg1.mtype = 1;


    	fgets(msg1.buf,100,stdin);

	    int res = msgsnd(msqid,&msg1,sizeof(msg1.buf),0);

    }

}

void *read1(void *arg)
{


	key_t key = ftok("/",'b');
    if(key==-1)
    {
        perror("ftok");
        exit(-1);
    }


     int msqid = msgget(key,IPC_CREAT|0666);       //2.通過key建立訊息佇列
    if(msqid==-1)
    {
        perror("msgget");
        exit(-2);
    }

     struct MSG_read msg;
     while(1)
     {
     	    int res = msgrcv(msqid,&msg,sizeof(msg.buf_read),2,0);   //收型別為2 的資訊
	    if(res==-1){
	        perror("msgrcv");
	        exit(-3);
	    }
	     printf("%s",msg.buf_read);
     }

}




int main()
{
	pthread_t id1;
	pthread_t id2;

    //建立執行緒
    int res = pthread_create(&id1,0,write1,0);
    if(res){
        printf("%s\n",strerror(res));
        //exit(-1);
    }

    int res2 = pthread_create(&id2,0,read1,0);
    if(res2){
        printf("%s\n",strerror(res2));
        //exit(-1);
    }

     pthread_join(id1,0);
     pthread_join(id2,0);

	return 0;
}

b.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>


struct MSG{
    long mtype;//訊息型別
    char buf[100];//訊息資料
};

struct MSG_read{
    long mtype_read;//訊息型別
    char buf_read[100];//訊息資料
};



void *read2(void *arg)
{

       //1.獲取key
    key_t key = ftok("/",'a');
    if(key==-1)
    {
        perror("ftok");
        exit(-1);
    }


     int msqid = msgget(key,IPC_CREAT|0666);       //2.通過key建立訊息佇列
    if(msqid==-1)
    {
        perror("msgget");
        exit(-2);
    }

     struct MSG msg1;
     while(1)
     {
        int res = msgrcv(msqid,&msg1,sizeof(msg1.buf),1,0);   //收型別為2 的資訊
        if(res==-1){
            perror("msgrcv");
            exit(-3);
        }
         printf("%s",msg1.buf);
     }
  
}

void *write2(void *arg)
{

    key_t key = ftok("/",'b');
    if(key==-1)
    {
        perror("ftok");
        exit(-1);
    }


     int msqid = msgget(key,IPC_CREAT|0666);       //2.通過key建立訊息佇列
    if(msqid==-1)
    {
        perror("msgget");
        exit(-2);
    }

    struct MSG_read msg1;
    msg1.mtype_read = 2;
    while(1)
    {
        
        
        fgets(msg1.buf_read,100,stdin);


        int res = msgsnd(msqid,&msg1,sizeof(msg1.buf_read),0);

    }
}



int main()
{
	pthread_t id1;
	pthread_t id2;

    //建立執行緒
    int res = pthread_create(&id1,0,write2,0);
    if(res){
        printf("%s\n",strerror(res));
        //exit(-1);
    }

    int res2 = pthread_create(&id2,0,read2,0);
    if(res2){
        printf("%s\n",strerror(res2));
        //exit(-1);
    }

     pthread_join(id1,0);
     pthread_join(id2,0);

	return 0;
}

 gcc a.c -pthread -o b.out

gcc b.c  -pthread