Linux系統程式設計(12) 程序間通訊 共享記憶體

2021-09-30 20:39:28 字數 2929 閱讀 6502

同乙個記憶體塊,實現通訊。

共享記憶體使用方式:

在核心中先建立共享記憶體物件(所用函式:frok,shmget)

多個程序附加到這個共享記憶體物件上(所用函式:shmat,和malloc很像)

就可以直接讀寫這個共享記憶體了

shmget函式:用來建立共享記憶體

標頭檔案:

#include

函式:

int shmget(key_t key, size_t size, int shm***)

引數:

key:這個共享記憶體段名字,核心中可以同時包含很多共享記憶體物件,使用不同的key 區別不同的共享記憶體物件。

size:共享記憶體大小    

shm***:由九個許可權標誌構成,它們的用法和建立檔案時使用的mode模式標誌是一樣的。

返回值:

成功返回乙個非負整數,即該共享記憶體段的標識碼失敗返回-1

int ret=shmget(key,1024,ipc_creat | 0666);  //ipc_creat  存在就開啟,不存在就建立

if (ret < 0)

ftok函式:得到key,就是shmget函式中的引數 keykey_t ftok(const char *pathname,int proj_id);

返回值:失敗返回-1

//兩個引數一樣,得到的值永遠一樣,引數寫啥都不是很重要

key_t key=ftok(".",0x1); //當前資料夾,必須有效路徑 //0x1 隨便給的

if (key == -1)

ipcs -m:檢視系統中的共享記憶體共享記憶體的生命週期跟隨核心。 共享記憶體一直存在到手動釋放或者系統重啟。void *shmat(int shmid, const void *shmaddr, int shm***); 

引數:

shmid: 共享記憶體標識,類似檔案描述符

shmaddr:指定連線的位址,一般不用新增,都是null,也就是讓系統說了算。作用連線虛擬位址和實體地址。

shm***:它的兩個可能取值是shm_rnd和shm_rdonly,一般預設添0都可以,大部分不使用。

返回值:

指標型別,指向共享記憶體第乙個節;失敗返回-1

重複的**放標頭檔案:(核心)

//重複**,放到  shm.h 中就好了

#pragma once //防止重複呼叫

#include#include#include//共享記憶體標頭檔案

static int creatshm()

printf("key= %d\n", key);

int ret = shmget(key, 1024, ipc_creat | 0666); //ipc_creat:存在就開啟,不存在就建立,類似檔案使用 //返回值類似檔案描述符

if (ret < 0)

printf("ret =%d\n", ret);

//共享記憶體建立之後就要設定許可權,也就只有讀,寫

return ret;

}

建立乙個共享記憶體物件:

檔案中

#include"shm.h"

//建立乙個共享記憶體物件

int main()

reader.c 檔案:讀實現

檔案

#include"shm.h"

int main()

write.c檔案:寫實現

檔案

#include"shm.h"

int main()

makefile檔案:

//makefile

.phony:all

all : reader writer //乙個make生成所有的

reader : reader.c

gcc $^ -o $@

writer : writer.c

gcc $^ -o $@

.phony:clean

clean :

rm reader writer

執行自然先寫,再讀。

解除共享記憶體:

可以用函式shmdt函式,不釋放也無所謂沒什麼影響。

Linux系統程式設計 程序間同步

我們知道,執行緒間同步有多種方式,比如 訊號量 互斥量 讀寫鎖,等等。那程序間如何實現同步呢?本文介紹兩種方式 互斥量和檔案鎖。互斥量mutex 主要應用函式 pthread mutexattr t mattr 型別 用於定義互斥量的屬性 pthread mutexattr init函式 初始化乙個...

linux系統程式設計 程序間通訊 pipe

程序間通訊 pipe 每個程序各自有不同的使用者位址空間,任何乙個程序的全域性變數在另乙個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊 ipc,interproce...

Linux系統程式設計 程序間通訊 IPC

利用檔案進行程序間通訊的程式示例 include include include include include include intmain if pid 0 write fd1,str,strlen str printf child wrote over n if pid 0 sleep 1 ...