linux學習筆記17 linux共享記憶體使用

2021-09-18 01:12:16 字數 1772 閱讀 9559

共享記憶體的使用也是ipc的一種方式,這種方式資料拷貝次數較少,效率較高。

其原理也是在記憶體中開闢一塊公共訪問的區域,可以讓各個程序連線讀寫。

共享記憶體的api函式主要有以下四個

int shmget(key_t key, size_t size, int shm***);建立或加入共享記憶體

key_t key:16進製制 非0資料。 0x1111  ----我理解為是共享記憶體塊的標號,程序通過key值連到同乙個共享記憶體中。 其中0x0000代表私有private,此時不允許其他程序再接入,其他非零正整數則代表共享的,可以允許程序接入

size_t size: 開闢的共享記憶體的大小,如果接入已存在的共享記憶體,必須大小一致,否則會報錯

int shm***:需要填寫1.狀態:讀寫執行許可權 -- 8進製。 0644 。 第一位的0一定不能省略

2.標誌位,常用的是ipc_creat,建立一塊共享記憶體,如果存在,就加入這塊共享記憶體

ipc_excl是和ipc_creat一起使用的,當共享記憶體存在就會報錯

返回值:成功 0, 失敗-1, 設定errorno

void *shmat(int shmid, const void *shmaddr, int shm***);//單個程序獲得共享記憶體的位址,並設定讀寫許可權

shm***: shm_rnd 讀寫。

shm_rdonly 唯讀。

int shmdt(const void *shmaddr);//單個程序取消共享記憶體位址關聯

取消 程序與共享記憶體的 關聯關係。

返回值:成功 0, 失敗-1, 設定errorno

int shmctl(int shmid, int cmd, struct shmid_ds *buf);//共享記憶體位址的控制,主要使用這個函式關閉共享記憶體

shmid: shmget 返回值

cmd:    ipc_rmid 刪除 共享記憶體 (使用這個函式時,key值變為0x0000,不允許其他程序接入,但是這塊共享記憶體並沒有關閉,只有當引用計數(就是已連線在共享記憶體的程序數)變為 0時,才真正關閉,)

對應 引數3 傳 null

返回值:成功 0, 失敗-1, 設定errorno

#include #include #include #include #include #include #include #include #include #include int main()

printf("shmget is success!\n, shmid = %d", shmid);

char *buf=null;

buf = shmat(shmid, null, shm_rnd);//獲得共享記憶體的位址

if (buf==(void*)-1)

memcpy(buf, "hello", 5);

printf("buf is %s\n", buf);

getchar();

getchar();

shmdt(buf);//取消和共享記憶體的聯絡

getchar();

int ret = shmctl(shmid, ipc_rmid, null);//關閉共享記憶體

if (ret == -1)

return 0;

}

linux中檢視共享記憶體的指令:ipcs

linux學習筆記17

vim vim介紹 vim是vi的公升級版,vim和vi的最大區別就是編輯乙個文字時vi不會顯示顏色,vim會顯示顏色,vim的安裝方法yum install y vim enhanced。vim顏色顯示 vim的顏色和你檔案的具體內容有關,相同的檔案在不同的目錄下都有可能導致顏色不存在,vim的配...

linux指令碼攻略學習筆記17

sed是進行文字替換的不二之選。這樣,我們就可以通過sed用空白替代匹配的句子。先建立乙個包含替換文字的檔案。例如 我們的目標是移除包含 mobile phones 的句子。可以用sed語句來實現 這裡的匹配模式是用來匹配整句文字的正規表示式,檔案中的每一句話第乙個字元都是空格,句與句之間用 來分割...

Linux學習筆記17 alarm pause

inlcude unsigned int alarm unsigned int seconds int pause void alarm是乙個鬧鐘,在指定的秒數之後發出乙個sigalrm訊號 但是,alarm函式自身是馬上就返回的,不用等待n秒之後再返回,非同步 這個訊號只能本程序自己接收 如果在呼...