C語言 unix c 共享記憶體

2021-08-08 20:53:59 字數 2628 閱讀 2267

一、共享記憶體

1、獲取乙個鍵值 ftok(3)

2、使用鍵值獲取共享記憶體的id shmget(2)

#include

#include

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

引數:key:ftok(3)的返回值

size:指定共享記憶體段的尺寸

shm***:

mode:指定共享記憶體段的許可權

返回值:-1 錯誤 errno被設定

成功 返回共享記憶體段的id

編寫**建立乙個共享記憶體段,獲取該記憶體段的id(shmget.c)

#include

#include

#include

#include

int main(void)

printf("key=0x%x\n",key);

//獲取shmid

int shmid = shmget(key, 1024, ipc_creat|0664);

if(shmid == -1)

printf("shmid=0x%x\n", shmid);

return

0; }

tarena@ubuntu:~/day/day34$ a.out

key=0x1f08241a

shmid=0x10001

tarena@ubuntu:~$ ipcs -m

------ shared memory segments --------

key shmid owner perms bytes nattch status

0x00000000

0 tarena 600

393216

2 dest

0x1f08241a

65537 tarena 664

1024

03、將共享記憶體關聯到程序的虛擬位址空間shmat(2)

#include

#include

void *shmat(int shmid, const

void *shmaddr, int shm***);

引數:shmid:指定了共享記憶體段的id

shm***:

shm_rdonly:共享記憶體段唯讀

0:可都可寫

錯誤 (void *) -1 errno被設定

4、向記憶體讀寫資料

5、解除程序的虛擬位址到共享記憶體的關聯shmdt(2)

#include

#include

int shmdt(const

void *shmaddr);

引數:返回值:成功 0

錯誤 -1 errno被設定

舉例:使用共享記憶體段實現程序間的通訊(shma.c shmb.c)

shma.c:

#include

#include

#include

#include

int main(void)

printf("key=0x%x\n",key);

int shmid = shmget(key, 1024, ipc_creat|0664);

if(shmid == -1)

void *p = shmat(shmid, null, 0);

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

*((int*)p) = 321;//p的訪問方式由void*轉換為int*

//解除關聯

shmdt(p);

printf("shmid=0x%x\n", shmid);

return

0; }

命令: tarena@ubuntu:~/day/day34$ a

結果: key=0x1f08241a

shmid=0x10001

shmb.c:

#include

#include

#include

#include

int main(void)

printf("key=0x%x\n",key);

int shmid = shmget(key, 1024, ipc_creat|0664);

if(shmid == -1)

void *p = shmat(shmid, null, 0);

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

printf("%d\n",*((int*)p));

//解除關聯

shmdt(p);

printf("shmid=0x%x\n", shmid);

return

0; }

命令: tarena@ubuntu:~/day/day34$ b

結果: key=0x1f08241a

321 shmid=0x10001

分析:共享記憶體中,在取出資料後,記憶體中還有資料,只能覆蓋不能移除,和訊息佇列不太一樣

C語言 unix c 動態載入

動態載入 在程式中根據程式的需要,動態載入某個庫函式,這種行為稱為動態載入,系統為實現動態載入提供了一下函式 man 3 dlopen顯示幫助 標頭檔案 include void dlopen const char filename,int flag 引數 filename 制定了動態庫的檔案名字 ...

C語言 unix c 訊號基礎

二 訊號的基礎 1 什麼是訊號 訊號就是 軟中斷 軟中斷就是軟體模擬的中斷機制。2 中斷是什麼 正常的執行流程,訊號處理程式是兩條執行路線,但是屬於同乙個程序 3 系統為我們提供了哪些訊號?kill l 察看系統的中斷 64個訊號,32,33沒有 tarena ubuntu kill l 1 sig...

python 使用共享記憶體 c語言構建記憶體

測試環境 centos7 python3.6.5 首先使用c建立記憶體,這裡的方法是 作為引數讀乙個二進位制資料檔案進去,把檔案的內容作為共享記憶體的內容 定義塊 include include include int main int argc,char ar if argc 2 id shmge...