共享記憶體和訊號量(燈)結合

2021-08-13 05:14:44 字數 3166 閱讀 4415

共享記憶體:

是被多個程序共享的一部分物理記憶體.共享記憶體是程序間共享資料的一種最快的方法,乙個程序向共享記憶體區域寫入了資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容.

建立共享記憶體,使用shmget

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

key標識共享記憶體的鍵值: 0/ipc_private。 當key的取值為ipc_private,則函式shmget()將建立一塊新的共享記憶體;如果key的取值為0,而引數shm***中又設定ipc_private這個標誌,則同樣會建立一塊新的共享記憶體。

返回值:如果成功,返回共享記憶體識別符號;如果失敗,返回-1

對映共享記憶體,將這段建立的共享記憶體對映到具體的程序空間去,使用shmat

char * shmat ( int shmid, char *shmaddr, int flag)

引數:shmid:shmget函式返回的共享儲存識別符號

flag:決定以什麼方式來確定對映的位址(通常為0)

返回值:

如果成功,則返回共享記憶體對映到程序中的位址;如果失敗,則返回- 1

脫離對映,當乙個程序不再需要共享記憶體時,需要把它從程序位址空間中脫離。

int shmdt ( char *shmaddr )

訊號量(又名:訊號燈)與其他程序間通訊方式不大相同,主要用途是保護臨界資源.

程序可以根據它判定是否能夠訪問某些共享資源。除了用於訪問控制外,還可用於程序同步

二值訊號燈:訊號燈的值只能取0或1,類似於互斥鎖。 但兩者有不同:

訊號燈強調共享資源,只要共享資源可用,其他程序同樣可以修改訊號燈的值;

互斥鎖更強調程序,占用資源的程序使用完資源後,必須由程序本身來解鎖。

計數訊號燈:訊號燈的值可以取任意非負值

#include #include #include #include #include #include #include #include #include #include #define shmkey   1234

#define shmsize 4096

#define semkey 1234

union semun ;

int sem_p(int id)

return 0;

}int sem_v(int id)

return 0; }

int main()

shmaddr = shmat(shmid, null, 0); //對映 物理記憶體對映到虛擬記憶體

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

semid = semget(semkey, 1, ipc_creat | ipc_excl); //建立訊號量(集),只需要1個訊號量

if (-1 == semid)

union_sem.val = 1; //聯合體,用於初始化訊號量

ret = semctl(semid, 0, setval, union_sem); //初始化訊號量 初始化為1

if (-1 == ret)

*(int *)shmaddr = count;

while(1)

printf("process 1 : count = %d\n", tmp);

usleep(10);

tmp++;

*(int *)shmaddr = tmp;

sem_v(semid); //v操作,對訊號量加一

} ret = shmdt(shmaddr); //解除對映(共享記憶體)

if (-1 == ret)

usleep(1000);

shmctl(shmid, ipc_rmid, null); //刪除共享記憶體

semctl(semid, 0, ipc_rmid); //刪除訊號量

return 0;

}

#include #include #include #include #include #include #include #include #include #include #define shmkey   1234

#define shmsize 4096

#define semkey 1234

union semun ;

int sem_p(int id)

return 0;

}int sem_v(int id)

return 0; }

int main()

shmaddr = shmat(shmid, null, 0); //對映

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

semid = semget(semkey, 1, 0); //建立訊號量

if (-1 == semid)

/*union_sem.val = 1;

ret = semctl(semid, 0, setval, union_sem);

if (-1 == ret)

*/ while(1)

printf("process 2 : count = %d\n", tmp);

usleep(10);

tmp++;

*(int *)shmaddr = tmp;

sem_v(semid);

} ret = shmdt(shmaddr);

if (-1 == ret)

return 0;

}

訊號燈強調共享資源,只要共享資源可用,其他程序同樣可以修改訊號燈的值;

互斥鎖更強調程序,占用資源的程序使用完資源後,必須由程序本身來解鎖。

計數訊號燈:訊號燈的值可以取任意非負值

共享記憶體和訊號量

共享記憶體和訊號量實現程序間通訊的另外兩種機制。一.共享記憶體 1.共享記憶體的結構 2.實現共享記憶體的函式 1 shmget 函式 功能 建立共享記憶體 引數 key 共享記憶體的名字 size 共享記憶體的大小 以頁為單位分配資源 返回值 成功返回乙個非負整數,即共享記憶體的識別符號 失敗返回...

共享記憶體,訊號量

一.共享記憶體 共享記憶體 允許兩個不相關的程序訪問同乙個邏輯記憶體。為兩個正在執行的程序之間共享和傳遞資料不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址,是非同步通訊,也就是說,在第乙個程序結束對共享記...

共享記憶體 訊號量

1.共享記憶體 a.int shmget key t key,size t size,int shm 建立共享記憶體 參一 為共享記憶體段命名 參二 size以位元組為單位指定需要共享的記憶體容量 參三 許可權標誌 ipc creat 0644 返回值 共享記憶體識別符號 非負整數 b.void s...