用同乙個記憶體塊,實現通訊。共享記憶體使用方式:
在核心中先建立共享記憶體物件(所用函式:frok,shmget)
多個程序附加到這個共享記憶體物件上(所用函式:shmat,和malloc很像)
就可以直接讀寫這個共享記憶體了
shmget函式:用來建立共享記憶體
標頭檔案:
#include
函式:
int shmget(key_t key, size_t size, int shm***)
引數:
key:這個共享記憶體段名字,核心中可以同時包含很多共享記憶體物件,使用不同的key 區別不同的共享記憶體物件。
size:共享記憶體大小
shm***:由九個許可權標誌構成,它們的用法和建立檔案時使用的mode模式標誌是一樣的。
返回值:
成功返回乙個非負整數,即該共享記憶體段的標識碼;失敗返回-1
ftok函式:得到key,就是shmget函式中的引數 keykey_t ftok(const char *pathname,int proj_id);int ret=shmget(key,1024,ipc_creat | 0666); //ipc_creat 存在就開啟,不存在就建立
if (ret < 0)
返回值:失敗返回-1
ipcs -m:檢視系統中的共享記憶體共享記憶體的生命週期跟隨核心。 共享記憶體一直存在到手動釋放或者系統重啟。void *shmat(int shmid, const void *shmaddr, int shm***);//兩個引數一樣,得到的值永遠一樣,引數寫啥都不是很重要
key_t key=ftok(".",0x1); //當前資料夾,必須有效路徑 //0x1 隨便給的
if (key == -1)
引數:
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;
}
reader.c 檔案:讀實現檔案中
#include"shm.h"
//建立乙個共享記憶體物件
int main()
write.c檔案:寫實現檔案
#include"shm.h"
int main()
makefile檔案:檔案
#include"shm.h"
int main()
執行自然先寫,再讀。//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 ...