1. 程式人生 > >Linux_父子程序通過訊息佇列通訊

Linux_父子程序通過訊息佇列通訊

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

#define SIZE 1024

const long id = 1000;//這裡規定型別為1000的訊息

typedef struct msgqueue{
        long mytype;//訊息型別
        char mytext[SIZE];//訊息內容
}msgqueue;

int main(){
    key_t k = ftok(".",0x1234);//申請key,確保兩個需要通訊的程序使用同一個key值獲取到的佇列id
    if(k < 0){
        perror("ftok");
        return -1;
    }
    int msgid = msgget(k,IPC_CREAT|IPC_EXCL|0666);//使用key值獲取id
    if(msgid < 0){
        perror("msgget");
        return -1;
    }
    pid_t pid = fork();
    if(pid < 0){
        perror("fork");
        return -1;
    }
    if(pid > 0){//父程序發訊息
        msgqueue queue;
        queue.mytype = id;//傳送的訊息型別為1000
        char msg[SIZE];
        while(1){//迴圈輸入,此時輸入的每一條訊息,訊息型別都是1000
            printf("father says# ");
//            fflush(stdout);
            fgets(msg,sizeof(msg)+1,stdin);//從標準輸入獲取字串,以回車換行結束
            strcpy(queue.mytext,msg);
            if(msgsnd(msgid,&queue,sizeof(msg),0) == -1){//將資訊掛載到訊息佇列裡
                perror("msgsnd");
                return -1;
            }
            if(strncmp(msg,"end",3) == 0){//只要輸入end,認為結束通訊
                break;
            }
            usleep(500000);
        }
        waitpid(pid,NULL,0);//等待子程序退出
    }else if(pid == 0){//子程序取訊息,注意訊息佇列裡只要有人拿了訊息,那麼拿走的訊息就不在訊息佇列裡了
        msgqueue queue;
        while(1){//迴圈拿訊息
            if(msgrcv(msgid,&queue,sizeof(queue.mytext),id,0) == -1){//從訊息佇列裡取訊息,取一個少一個
                perror("msgrcv");
                return -1;
            }
            if(strncmp(queue.mytext,"end",3)==0){//end就退出
                printf("father will quit,i quit too\n");
                break;
            }
            printf("child recv:%s\n",queue.mytext);
        }
        exit(EXIT_SUCCESS);
    }
    if(msgctl(msgid,IPC_RMID,NULL)<0){//刪除訊息佇列,因為訊息佇列建立後不會自己刪除,必須人為刪除或者重啟
        perror("msgctl");
        return -1;
    }
    printf("\n done \n");//沒什麼含義,只是為了表示這次的傳輸是正常退出的
    return 0;
}

相關推薦

Linux_父子程序通過訊息佇列通訊

#include <stdio.h> #include <wait.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #includ

【C語言】【unix c】兩個程序通過訊息佇列實現程序間的通訊

send.c: #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>

linux c之通過訊息佇列實現程序通訊

1、訊息佇列的介紹 訊息佇列提供了一種從一個程序向另一個程序傳送一個數據塊的方法。  每個資料塊都被認為含有一個型別,接收程序可以獨立地接收含有不同型別的資料結構。我們可以通過傳送訊息來避免命名管道的同步和阻塞問題。但是訊息佇列與命名管道一樣,每個資料塊都有一個最大長度的限

asp.net c# 通過訊息佇列處理高併發請求(以搶小米手機為例)

  網站面對高併發的情況下,除了增加硬體, 優化程式提高以響應速度外,還可以通過並行改序列的思路來解決。這種思想常見的實踐方式就是資料庫鎖和訊息佇列的方式。這種方式的缺點是需要排隊,響應速度慢,優點是節省成本。 演示一下現象 建立一個在售產品表 CREATE TABLE [dbo].[product](

Linux-程序通訊-訊息佇列/訊號燈/共享記憶體

訊息佇列     訊息佇列提供了程序間傳送資料塊的方法,每個資料塊都可以被認為是有一個型別,接受者接受的資料塊可以有不同的型別;我們可以通過傳送訊息來避免命名管道的同步和阻塞問題;訊息佇列與命名管道一樣,每個資料塊都有一個最大長度的限制;我們可以將每個資料塊當作是一

Linux:程序通訊(匿名管道命名管道)(共享記憶體,訊息佇列,訊號量)

目錄 程序間通訊的介紹 管道 匿名管道 原理: 程式碼實現 匿名管道特性 實現管道符 |  命名管道 命名管道特性 程式碼實現 管道讀寫規則 作業系統中ipc的相關命令 共享記憶體(重點) 生命週期: 程式碼實現 程式碼實現獲

作業系統(11)程序--程序通訊:訊號、管道、訊息佇列、共享記憶體

文章目錄 1. 程序通訊相關概念 1. 通訊流程、屬性、鏈路 2. 程序通訊方式:直接通訊、間接通訊 2. 程序通訊的機制 1. 訊號 2. 管道 3. 訊息佇列

php程序通訊--訊息佇列

首先我們來看一下如何建立一個訊息佇列。 //建立訊息佇列 $msg_key = ftok( __FILE__, 'a' ); $msg_queue = msg_get_queue( $msg_key, 0666 );  在php中通過這兩句話就可以建立一個訊息佇列。 ftok 函式,是可以

Linux程序通訊——訊息佇列

總結下別人比較好的博文+自己寫的一個栗子   1.ftok()    https://blog.csdn.net/u013485792/article/details/50764224      &

Linux關於程序通訊訊息佇列

訊息佇列概念 訊息佇列提供了一個從一個程序向另外一個程序傳送一塊資料的方法 每個資料塊都被認為是有一個型別,接收者程序接收的資料塊可以有不同的型別值 訊息佇列也有管道一樣的不足,就是每個資料塊的最大長度是有上限的,系統上全體佇列的最大總長度也有一個上限 訊息佇列函式操作

Linux中程序通訊機制----訊息佇列

一、什麼是訊息 訊息(message)是一個格式化的可變長的資訊單元。訊息機制允許由一個程序給其它任意的程序傳送一個訊息。當一個程序收到多個訊息時,可將它們排成一個訊息佇列。 1、訊息機制的資料結構 (1)訊息首部 記錄一些與訊息有關的資訊,如訊息的型別、大小、

python筆記 7-8 程序程序通訊 迭代器 訊息佇列 Queue 協程 和正則表示式

day7 程序 程序池 程序通訊 迭代器 訊息佇列 Queue 作用 用於多個程序間的通訊 操作put放入訊息(值) put_nowait() 放入值,不等待 如果隊滿,則報錯 get獲取訊息(值) get_nowait() 獲取值,不等待 如果隊空,則報錯 判斷 f

程序通訊的方式——訊號、管道、訊息佇列、共享記憶體

多程序: 首先,先來講一下fork之後,發生了什麼事情。 由fork建立的新程序被稱為子程序(child process)。該函式被呼叫一次,但返回兩次。兩次返回的區別是子程序的返回值是0,而父程序的返回值則是新程序(子程序)的程序 id。將子程序id返回給父程序的理由是

程序通訊---管道、訊息佇列、共享記憶體

程序通訊分為低階通訊和高階通訊。 低階通訊是指程序互斥與同步,包括訊號、訊號量、管程等。 高階通訊方式有管道、訊息佇列、共享記憶體以及網路通訊中的套接字。 匿名管道PIPE: 管道是連線兩個程序的檔案,

嵌入式Linux併發程式設計,程序通訊方式,System V IPC,訊息佇列,開啟/建立msgget(), 傳送訊息msgsnd(),格式,接收訊息msgrcv(),控制訊息佇列 msgctl()

文章目錄 1,訊息佇列 2,訊息佇列結構 3,訊息佇列使用步驟 3.1,開啟/建立訊息佇列 msgget() 3.1.1,開啟/建立訊息佇列---示例msgget() 3.2,向訊息佇列傳送訊息 msgs

Linux系統程式設計——程序通訊訊息佇列

概述 訊息佇列提供了一種在兩個不相關的程序之間傳遞資料的簡單高效的方法,其特點如下: 1)訊息佇列可以實現訊息的隨機查詢。訊息不一定要以先進先出的次序讀取,程式設計時可以按訊息的型別讀取。 2)訊息佇列允許一個或多個程序向它寫入或者讀取訊息。 3)與無名管道、命名管道一

(三)程序通訊方式-----訊息佇列

訊息佇列 訊息佇列,是訊息的連結表,存放在核心中。一個訊息佇列由一個識別符號(即佇列ID)來標識。使用者程序可以向訊息佇列新增訊息,也可以向訊息佇列讀取訊息。 同管道檔案相比,訊息佇列中的每個訊息指定特定的訊息型別,接收的時候可以不需要按照佇列次序讀取,可以根據自定義型別

【Linux】Linux程序通訊訊息佇列

1、訊息佇列概念引入    訊息佇列提供了一個從一個程序向另外一個程序傳送一塊資料的方法每個資料塊都被認為是有一個型別,接收者程序接收的資料塊可以有不同的型別值訊息佇列也有管道一樣的不足,就是每個訊息的最大長度是有上限的(MSG

Linux 學習筆記—程序通訊訊息佇列、訊號量、共享記憶體的概念區別聯絡

2.5 訊息佇列(Message queues) 訊息佇列是核心地址空間中的內部連結串列,通過linux核心在各個程序直接傳遞內容,訊息順序地傳送到訊息佇列中,並以幾種不同的方式從佇列中獲得,每個訊息佇列可以用IPC識別符號唯一地進行識別。核心中的訊息佇列是通過

Linux環境程序通訊(三) 訊息佇列(轉)

轉自http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/, 作者:鄭彥興訊息佇列(也叫做報文佇列)能夠克服早期unix通訊機制的一些缺點。作為早期unix通訊機制之一的訊號能夠傳送的資訊量有限,後來雖然 POSIX 1003.1b在訊號的實時性方面作了