Linux IPC POSIX 共享記憶體

2022-05-14 04:13:12 字數 2239 閱讀 4148

#include //for fstat()

#include //for fstat()

#include #include #include shm_open() //建立/獲取共享記憶體fd

ftruncate() //建立者調整檔案大小

mmap() //對映fd到記憶體

munmap() //去對映fd

shm_unlink() //刪除共享記憶體

//建立/獲取共享記憶體的檔案描述符,成功返回檔案描述符,失敗返回-1

//link with -lrt.

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

oflag

mode: eg,0664 etc

//調整fd指向檔案的大小,成功返回0,失敗返回-1設errno

//vs truncate()

int ftruncate(int fd, off_t length);

如果原檔案大小》指定大小,原檔案中多餘的部分會被截除

int res=ftruncate(fd,3*sizeof(emp));//要用sizeof,且是emp(型別)不是emp(物件)

if(-1==res)

perror("ftruncate"),exit(-1);

//獲取檔案狀態,成功返回0,失敗返回-1設errno

//vs stat()

int lstat(const char *pathname, struct stat *buf);

int fstat(int fd, struct stat *buf);

buf:stat型別的指標

struct stat ;
//eg:

st_mode=100664 //100是檔案型別

//664是許可權, 通過100664和0777bitwiseand得到

st_mtime=1462787968 //秒

//對映檔案或裝置到程序的虛擬記憶體空間,對映成功後對相應的檔案或裝置操作就相當於對記憶體的操作

//對映以頁為基本單位,檔案大小, mmap的引數 len 都不能決定程序能訪問的大小, 而是容納檔案被對映部分的最小頁面數決定傳統檔案訪問

//要求對檔案進行可讀可寫的的開啟!!!

//成功返回對映區的指標,失敗返回-1設errno

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); //prot:protection, 許可權

addr:對映的起始位址, 如果為null則由kernel自行選擇->最合適的方法

length:對映的區域長度

prot:對映記憶體的保護許可權

flags

must include one of :

can be bitwise ored:

fd: file decriptor

offset: 檔案中的偏移量

void* pv=mmap(null,4,prot_read|prot_write,map_private|map_anonymous,0,0);

if(map_failed==pv)

perror("mmap"),exit(-1);

//接觸檔案或裝置對記憶體的對映,成功返回0,失敗返回-1設errno

int munmap(void *addr, size_t length);

//關閉程序開啟的共享記憶體物件,成功返回0,失敗返回-1

//link with -lrt.

int shm_unlink(const char *name);

共享與偽共享

共享就是乙個記憶體區域的資料被多個處理器訪問,偽共享就是不是真的共享。這裡的共享這個概念是基於邏輯層面的。實際上偽共享與共享在cache line 上實際都是共享的。cpu訪問的資料都是從cache line 中讀取的。如果cpu 在cache 中找不到需要的變數,則稱快取未命中。未命中時,需要通過...

mysql 共享nfs nfs共享

nfs共享 實驗環境 服務端 192.168.36.158 客戶端 192.168.36.159 iptables and selinux disabled 一.nfs net file system 簡介 nfs分為伺服器和客戶機兩部分,每個主機都有自己的核心級服務 外部資料表示 xdr,exte...

linux 實現共享檔案共享

linux和winxp資訊共享 samba伺服器的安裝和配置 步驟 1 查詢是否安裝了samba服務 rpm q samba rpm qa grep samba service smb start 2 安裝samba a 掛載映象 mount t iso9660 iso mymedia o loop...