Linux 進程間通信 消息隊列 實現兩個進程間通信


例子: 通過消息隊列實現兩個進程間通信,一個進程從終端輸入數據,通過消息隊列發送,另一個進程通過消息隊列接收數據

  文件1 創建進程1 終端輸入通過消息隊列發送數據

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>

struct msgbuf //消息結構體
{
    long types;
    char msg[20];
};
struct msgbuf mymsgbuf; //定義消息結構變量

int main(int argc, const char *argv[])
{
    key_t key;
    int msgid;

    mymsgbuf.types = 100; //給消息結構賦值

    key = ftok("./app",'a');  //建立key值
    if(key < 0)
    {
        perror("ftok fail ");
        exit(1);
    }

    // 創建消息隊列,如果消息隊列存在,errno 會提示 eexist
    // 錯誤,此時只需要直接打開消息隊列即可
    msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666);
    if(msgid < 0)
    {
        if(errno == EEXIST) //文件存在錯誤提示
        {
            msgid = msgget(key,0666);//打開消息隊列
        }
        else //其他錯誤退出
        {
            perror("msgget fail ");
            exit(1);
        }
    }
    while(1) //循環從終端獲取數據,然后通過消息隊列發送出去,輸入 “quit” 結束循環
    {
        fgets(mymsgbuf.msg, 10, stdin); //終端獲取消息寫入消息隊列中
        //發送消息
        msgsnd(msgid, &mymsgbuf, sizeof(mymsgbuf)-sizeof(long),0);
        if(strstr(mymsgbuf.msg, "quit")!=NULL)
        {
            break;
        }
    }
    
    //刪除消息隊列
    msgctl(msgid, IPC_RMID, NULL);

    return 0;
}

文件 2 創建進程2 ,接收消息隊列的數據,打印到終端上

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>

struct msgbuf //消息結構體
{
    long types;
    char b[20];
};
struct msgbuf mymsgbuf, recvbuf; //定義消息結構變量

int main(int argc, const char *argv[])
{
    key_t key;
    int msgid;

    mymsgbuf.types = 100; //給消息結構賦值

    key = ftok("./app",'a');  //建立key值
    if(key < 0)
    {
        perror("ftok fail ");
        exit(1);
    }

    // 創建消息隊列,如果消息隊列存在,errno 會提示 eexist
    // 錯誤,此時只需要直接打開消息隊列即可
    msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666);
    if(msgid < 0)
    {
        if(errno == EEXIST) //文件存在錯誤提示
        {
            msgid = msgget(key,0666);//打開消息隊列
        }
        else //其他錯誤退出
        {
            perror("msgget fail ");
            exit(1);
        }
    }

    while(1)  //接收到 “quit” 結束循環
    {
        //接收消息
        msgrcv(msgid,&recvbuf,sizeof(mymsgbuf)-sizeof(long),100,0); //recvbuf 是接收消息的結構體,其中的b是實際的數據
        if(strstr(recvbuf.b, "quit") != NULL)
        {
            break;
        }
        printf("recvbuf: %s", recvbuf.b); //
    }

    //刪除消息隊列
    msgctl(msgid, IPC_RMID, NULL);

    return 0;
}

測試:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM