1. 程式人生 > >程序間通訊之共享記憶體:shm

程序間通訊之共享記憶體:shm

shm程式碼

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>

struct shm////共享記憶體使用的結構體的宣告 
{
    volatile int beon; 
};

int main(int argc, const char *argv[]){

    struct shm *shms;//結構體指標定義 

    key_t key;//key定義
    int shmid;//共享記憶體id定義

    key = ftok("/tmp",'r');//獲取key
    if(-1
== key){ perror("ftok"); return -1; } shmid = shmget(key,sizeof(struct shm),IPC_CREAT|IPC_EXCL|0666);//共享記憶體的獲取 if(-1 == shmid){ if(errno == EEXIST){ shmid = shmget(key,sizeof(struct shm),0); }else{ perror("shmget"); return
-1; } } shms = shmat(shmid,NULL,0);//共享記憶體的對映 if(-1 == *(int *)shms){ perror("shmat"); return -1; } //通過最後一個函式(共享記憶體的對映),shms指標指向的結構體成為共享記憶體中的結構體. //可以通過shms指標來對結構體裡面的資料進行讀寫. }

共享記憶體的檢視及刪除

注意:如果記憶體中已經有以key建立的共享記憶體,而你想以key在建立一個共享記憶體,會出現段錯誤.

一般在你修改共享記憶體結構體的時候會發生這種情況

而處理方法就是刪除共享記憶體

//首先檢視共享記憶體
ipcs -m -p
//刪除
ipcrm -m <shmid>


ipcrm命令用來刪除一個或更多的訊息佇列、訊號量集或者共享記憶體標識。
ipcrm [ -m SharedMemoryID ] [ -M SharedMemoryKey ] [ -q MessageID ] [ -Q MessageKey ] [ -s SemaphoreID ] [ -S SemaphoreKey ]

-m SharedMemory id 刪除共享記憶體標識 SharedMemoryID。與 SharedMemoryID 有關聯的共享記憶體段以及資料結構都會在最後一次拆離操作後刪除。 
-M SharedMemoryKey 刪除用關鍵字 SharedMemoryKey 建立的共享記憶體標識。與其相關的共享記憶體段和資料結構段都將在最後一次拆離操作後刪除。 
-q MessageID 刪除訊息佇列標識 MessageID 和與其相關的訊息佇列和資料結構。 
-Q MessageKey 刪除由關鍵字 MessageKey 建立的訊息佇列標識和與其相關的訊息佇列和資料結構。 
-s SemaphoreID 刪除訊號量標識 SemaphoreID 和與其相關的訊號量集及資料結構。 
-S SemaphoreKey 刪除由關鍵字 SemaphoreKey 建立的訊號標識和與其相關的訊號量集和資料結構。