linuxC多程序通訊 POSIX共享記憶體

2021-09-26 16:28:19 字數 3986 閱讀 8385

簡單的共享記憶體讀寫示例

訊號量和共享記憶體 使用示例

函式功能:改變檔案大小

相關函式:open、truncate

表頭檔案:#include

函式原型:int ftruncate(int fd, off_t length)

函式說明:ftruncate()會將引數fd指定的檔案大小改為引數length指定的大小。引數fd為已開啟的檔案描述詞,而且必須是以寫入模式開啟的檔案。如果原來的檔案件大小比引數length大,則超過的部分會被刪去

返 回 值:0、-1

錯誤原因:errno

ebadf 引數fd檔案描述詞為無效的或該檔案已關閉

einval 引數fd為一socket並非檔案,或是該檔案並非以寫入模式開啟

munmap

函式說明 munmap()用來取消引數start所指的對映記憶體起始位址,引數length則是欲取消的記憶體大小。當程序結束或利用exec相關函式來執行其他程式時,對映記憶體會自動解除,但關閉對應的檔案描述符時不會解除對映。

munmap(解除記憶體對映)

相關函式 mmap

表頭檔案 #include

#include

定義函式 int munmap(void *start,size_t length);

函式說明 munmap()用來取消引數start所指的對映記憶體起始位址,引數length則是欲取消的記憶體大小。當程序結束或利用exec相關函式來執行其他程式時,對映記憶體會自動解除,但關閉對應的檔案描述符時不會解除對映。

返回值 如果解除對映成功則返回0,否則返回-1,錯誤原因存於errno中錯誤**einval

read

#include #include #include #include #include #include #include #define shm_name "/shm"

int main (void)

ftruncate (shm_fd, 8192);

struct stat filestat;

fstat (shm_fd, &filestat);

printf ("st_size: %ld\n", filestat.st_size);

char *shm_ptr;

shm_ptr = (char*)mmap (null, filestat.st_size, \

prot_read|prot_write, map_shared, shm_fd, 0);

close (shm_fd);

printf ("pid %d: %s\n", getpid(), shm_ptr);

munmap (shm_ptr, filestat.st_size);

shm_unlink (shm_name);

return 0;

}

write
#include #include #include #include #include #include #include #include #define shm_name "/shm"

int main (void)

ftruncate (shm_fd, 8192);

struct stat filestat;

fstat (shm_fd, &filestat);

printf ("st_size: %ld\n", filestat.st_size);

char *shm_ptr;

shm_ptr = (char*)mmap (null, filestat.st_size, \

prot_read|prot_write, map_shared, shm_fd, 0);

close (shm_fd);

char buf = "hello world";

memmove (shm_ptr, buf, sizeof (buf));

printf ("pid %d: %s\n", getpid(), shm_ptr);

munmap (shm_ptr, filestat.st_size);

return 0;

}

write
#include #include #include #include #include #include #include #include #define shm_name "/memmap"

#define sem_name "/memmap_sem"

int main (void)

ftruncate (shm_fd, 8192);

struct stat filestat;

fstat (shm_fd, &filestat);

printf ("st_size: %ld\n", filestat.st_size);

char *shm_ptr;

shm_ptr = (char*)mmap (null, filestat.st_size, \

prot_read|prot_write, map_shared, shm_fd, 0);

close (shm_fd);

char msg = "hello world";

memmove (shm_ptr, msg, sizeof (msg));

printf ("pid %d: %s\n", getpid(), shm_ptr);

sem_post (sem);

sem_close (sem);

sleep (5);

munmap (shm_ptr, 8192);

return 0;

}

read
#include #include #include #include #include #include #include #include #define shm_name "/memmap"

#define sem_name "/memmap_sem"

int main (void)

ftruncate (shm_fd, 8192);

struct stat filestat;

fstat (shm_fd, &filestat);

printf ("st_size: %ld\n", filestat.st_size);

char *shm_ptr;

shm_ptr = (char*)mmap (null, filestat.st_size, prot_read|prot_write, \

map_shared, shm_fd, 0);

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

close (shm_fd);

sem_wait (sem);

printf ("pid %d: %s\n", getpid(), shm_ptr);

sem_close (sem);

munmap (shm_ptr, 8192);

shm_unlink (shm_name);

sem_unlink (sem_name);

return 0;

}

linuxC多程序通訊systemv 共享記憶體

共享記憶體通訊限制 舉例 獲取共享記憶體物件的id int shmget key t key,size t size,int shm 對映共享記憶體 void shmat int shmid,const void shmaddr,int shm 解除記憶體對映 int shmdt const voi...

linuxC多程序通訊 檔案鎖

英文名 file lock,在同一時刻只允許乙個程序對檔案進行訪問 建議性鎖 advisory locking,又稱協同鎖 核心只提供加減鎖以及檢測是否加鎖,不提供鎖的控制與協調工作 需要多程序相互檢測確認的加鎖機制 a程序對乙個操作的檔案加了鎖 b程序同樣可以對該檔案進行讀寫操作 只有當b程序也對...

python多程序通訊

這是看書筆記 python提供了多種程序通訊的方式,比如說queue,pipe,value array等。其中queue主要用來在多個程序之間實現通訊。pipe常用來在兩個程序之間實現通訊。queue是多程序安全佇列,queue通過put和get方法來實現多程序之間的資料傳遞。put方法用於將資料插...