1. 程式人生 > >Linux程序間通訊——IPC共享記憶體學習筆記

Linux程序間通訊——IPC共享記憶體學習筆記

一、什麼是共享記憶體
共享記憶體就是允許兩個不相關的程序訪問同一個邏輯記憶體。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段實體記憶體。程序可以將同一段共享記憶體連線到它們自己的地址空間中,所有程序都可以訪問共享記憶體中的地址,就好像它們是由用C語言函式malloc分配的記憶體一樣。而如果某個程序向共享記憶體寫入資料,所做的改動將立即影響到可以訪問同一段共享記憶體的任何其他程序。(此處節選於網路)

int shmget(key_t key, size_t size, int shmflg);//建立共享記憶體函式

第一個引數,key如果是IPC_PRIVATE表示建立一個新的共享記憶體;
第二個引數,size以位元組為單位指定需要共享的記憶體容量;
第三個引數,shmflg為讀寫的許可權,例如0666代表root,user,other都具有讀寫的許可權;

void *shmat(int shmid, const void *shmaddr, int shmflg);//附加到共享記憶體區

第一個引數,shm_id是由shmget函式返回的共享記憶體標識。
第二個引數,shm_addr指定共享記憶體連線到當前程序中的地址位置,通常為空,表示讓系統來選擇共享記憶體的地址。
第三個引數,shm_flg是一組標誌位,通常為0。

int shmdt(const void *shmaddr);//將共享記憶體從呼叫的程序的地址空間分離

引數shmaddr是shmat函式返回的地址指標,呼叫成功時返回0,失敗時返回-1.

下面以一道例題來加深對共享記憶體的理解
1、編寫兩個程序a和b,利用共享記憶體技術,a向共享記憶體寫字串,b將從共享記憶體中讀到的字串在螢幕上打印出來。

/* create_mem.c */

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int main(int arg,char *args[])
{
    int shmid=shmget(IPC_PRIVATE,1024,0666);//建立共享記憶體區
    if(shmid<0)
    {
        printf("failed\n");
    }
    else
    {
        printf("success\n"
); } return 0; }
/*write_mem.c*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>

int main(int arg,char *args[])
{
    char *shmbuf=NULL;
    int shmid=0;
    if(arg>1)
    {
        shmid=atoi(args[1]);
        shmbuf=shmat(shmid,0,0);//附加到共享記憶體區
        while(1)
        {
            scanf("%s\n", shmbuf);;//從鍵盤鍵入的字串寫入到共享記憶體中
        }
        shmdt(shmbuf);//將共享記憶體從呼叫的程序的地址空間分離
    }

    return 0;
}


/*read_mem.c*/

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int main(int arg, char *args[])
{
    int shmid = 0;
    char *shmbuf = NULL;
    if (arg > 1)
    {
        shmid = atoi(args[1]);
        shmbuf = shmat(shmid, 0, 0); //附加到共享記憶體區
        while (1)
        {
            printf("%s\n", shmbuf); //從共享記憶體讀取內容並列印
            if (strncmp("exit", shmbuf, 4) == 0) //如果共享記憶體字串為"exit",程式退出
                break;
            sleep(1);
        }
    }
    shmdt(shmbuf); //將共享記憶體從呼叫程序的地址空間分離出
    return 0;
}

ipcs -m 命令可以查詢系統中的共享記憶體
這裡寫圖片描述

結果:
這裡寫圖片描述

這裡寫圖片描述