Linux 共享記憶體例子

2021-07-25 08:49:16 字數 3841 閱讀 5384

linux環境下程序之間通過記憶體共享實現通訊的方式有很多種。

1.  shm_*** 這種函式,可以實現在不同程序之間(尤其是非父母程序之間)進行記憶體共享

write.c檔案

#include #include #include #include #include #include #include #include /*

int shm_open(const char *name, int oflag, mode_t mode);

//建立或開啟乙個共享記憶體,成功返回乙個整數的檔案描述符,錯誤返回-1。

1.name:共享記憶體區的名字;

2.標誌位;open的標誌一樣

3.許可權位

int shm_unlink(const char *name);

編譯時要加庫檔案-lrt*/

#define shmname "shm_ram"

#define open_flag o_rdwr|o_creat

#define open_mode 00777

#define file_size 4096*4

int main(void)

//調整確定檔案共享記憶體的空間

ret = ftruncate(fd, file_size);

if(-1 == ret)

//對映目標檔案的儲存區

add_w = mmap(null, file_size, prot_write, map_shared, fd, seek_set);

if(null == add_w)

//memcpy 記憶體共享 寫入內容

memcpy(add_w, "howaylee", sizeof("howaylee"));

//取消對映

ret = munmap(add_w, file_size);

if(-1 == ret)

//刪除記憶體共享

/*shm_unlink(shmname);

if(-1 == ret)

*/_out:

return ret;

}

read.c檔案

#include #include #include #include #include #include #include #include /*

int shm_open(const char *name, int oflag, mode_t mode);

//建立或開啟乙個共享記憶體,成功返回乙個整數的檔案描述符,錯誤返回-1。

1.name:共享記憶體區的名字;

2.標誌位;open的標誌一樣

3.許可權位

int shm_unlink(const char *name);

編譯時要加庫檔案-lrt

*/#define shmname "shm_ram"

#define open_flag o_rdwr|o_creat

#define open_mode 00777

#define file_size 4096*4

int main(void)

; void* add_r = null;

//建立或者開啟乙個共享記憶體

fd = shm_open(shmname, open_flag, open_mode);

if(-1 == (ret = fd))

//調整確定檔案共享記憶體的空間

ret = ftruncate(fd, file_size);

if(-1 == ret)

//對映目標檔案的儲存區

add_r = mmap(null, file_size, prot_read, map_shared, fd, seek_set);

if(null == add_r)

//memcpy 記憶體共享 寫入內容

memcpy(buf, add_r, sizeof(buf));

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

//取消對映

ret = munmap(add_r, file_size);

if(-1 == ret)

/*//刪除記憶體共享

shm_unlink(shmname);

if(-1 == ret)

*/_out:

return ret;

}

編譯的時候gcc加上-lrt,分別編譯出write,read。

./write之後./read會輸出 "buf = howaylee"

2. shmget等函式也可以

client.c檔案

/* 編譯命令:gcc -o client client.c -g*/

#include#include#include#define segsize 1024

#define readtime 1

union semun

arg;

/* 列印程式的執行時間函式 */

void out_time(void)

printf("second: %d\n", (long)(time(null)) - start);

}/* 建立訊號量 */

int new_sem(key_t key)

return semid;

}/* 訊號量等待函式,等待訊號量的值變為0 */

void wait_v(int semid)

; semop(semid, &sops, 1);

}int main(int argc, char **argv)

semid = new_sem(key);

for (i = 0;i < 3;i ++)

shmdt(shm);

return 0;

}

server.c檔案

#include#include#include#include#includeunion semum

;#define segsize 1024

#define readtime 1

/* 建立訊號量 */

int sem_creat(key_t key)

semctl(semid, 0, setval, sem);

return semid;

}/* 刪除訊號量*/

int del_sem(int semid)

/* 訊號量的p操作,使得訊號量的值加1 */

int p(int semid)

; return (semop(semid, &sops, 1));

}/* 訊號量的v操作,使得訊號量的值減1 */

int v(int semid)

; return (semop(semid, &sops, 1));

}/* server主程式 */

int main(int argc, char **argv)

shm = (char *)shmat(shmid, 0, 0);

if (-1 == (int)shm)

semid = sem_creat(key);

for (i = 0; i <= 3; i++)

shmdt(shm);

shmctl(shmid,ipc_rmid,&buf);

del_sem(semid);

return 0;

}

3. android通過ion記憶體來實現父程序和子程序之間的記憶體共享(不知道非父子程序之間怎麼用ion記憶體)

4. 通過mmap實現()

共享記憶體例子

共享記憶體是lunix 系統中最底層的通訊機制,也是最快速的通訊機制 共享記憶體通過兩個或多個程序共享同一塊記憶體區域來實現程序間的通訊。通常是由乙個程序建立一塊共享 記憶體區域,然後多個程序可以對其進行訪問,乙個程序將要傳出的資料存放到共享記憶體中,另乙個或多個程序則直接從共享記憶體中讀取資料。因...

Linux 共享記憶體

一 概念 共享記憶體是被多個程序共享的一部分物理記憶體,是程序間共享資料的最快的一種方法。二 實現 分為兩個步驟 1 建立共享記憶體。2 對映共享記憶體。1 建立 int shmget key t key,int size,int shm 當key的取值為 ipc private 時,將建立一塊新的...

linux共享記憶體

linux共享記憶體使用 標頭檔案 include 1 建立共享記憶體 int shmget key t key,size t size,int shm 建立成功以後會返回乙個共享記憶體id,建立失敗返回 1。2 獲取共享記憶體 void shmat int shmid,const void shm...