Linux学习之系统编程篇:利用 shm 进行进程间通信
生活随笔
收集整理的這篇文章主要介紹了
Linux学习之系统编程篇:利用 shm 进行进程间通信
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、寫進(jìn)程 shm_w.c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/ipc.h> #include <sys/shm.h> int main() {// 1. 申請一塊共享內(nèi)存int shmid = shmget(0x12, 100, IPC_CREAT | IPC_EXCL | 0666); // 寫進(jìn)程創(chuàng)建內(nèi)存if(shmid == -1){perror("shmget err");exit(1);}// 2. 將當(dāng)前進(jìn)程跟共享內(nèi)存連接void * shmaddr = shmat(shmid, NULL, 0);if(shmaddr == (void*)-1){perror("shmat err");exit(1);}// 3. 向共享內(nèi)存中寫入數(shù)據(jù)memcpy(shmaddr, "hello world",12);// 4. 斷開連接printf("按任意鍵斷開共享內(nèi)存\n");getchar(); // 阻塞shmdt(shmaddr);// 5. 銷毀共享內(nèi)存printf("按任意鍵銷毀共享內(nèi)存\n");getchar();shmctl(shmid, IPC_RMID, NULL);return 0; }二、讀進(jìn)程 shm_r.c
// 頭文件同 shm_w.c int main() {// 1. 打開一塊已存在的共享內(nèi)存int shmid = shmget(0x12, 100, 0); if(shmid == -1){perror("shmget err");exit(1);}// 2. 將當(dāng)前進(jìn)程跟共享內(nèi)存連接void * shmaddr = shmat(shmid, NULL, 0);if(shmaddr == (void*)-1){perror("shmat err");exit(1);}// 3. 從共享內(nèi)存中讀出數(shù)據(jù)printf("%s\n",(char*)shmaddr);// 4. 斷開連接printf("按任意鍵斷開共享內(nèi)存\n");getchar();shmdt(shmaddr);// 5. 銷毀共享內(nèi)存printf("按任意鍵銷毀共享內(nèi)存\n");getchar();shmctl(shmid, IPC_RMID, NULL);return 0; }三、shm 系統(tǒng)命令
查看 shm 狀態(tài)的系統(tǒng)命令:ipcs -m。
(1)有一個進(jìn)程創(chuàng)建了共享內(nèi)存: 按上例, shm_w.c,執(zhí)行 shmget(), 終端執(zhí)行 ipcs -m。
(2)又有一個進(jìn)程打開了共享內(nèi)存: 按上例, shm_r.c,執(zhí)行 shmget()。
(3)有一個進(jìn)程斷開了共享內(nèi)存: 按上例, shm_w.c,執(zhí)行 shmdt()。
(4)全部進(jìn)程都斷開了共享內(nèi)存: 按上例, shm_r.c,也執(zhí)行 shmdt()。
(5)其他進(jìn)程沒有全部進(jìn)斷開連接時候,其中一個進(jìn)程就銷毀了共享內(nèi)存:
按上例,shm_r.c,還沒有執(zhí)行 shmdt(), shm_w.c,就執(zhí)行 shmdt()和 shmctl()。
注意:此時內(nèi)存銷毀的結(jié)果不可避免,但是由于還有其他進(jìn)程使用著共享內(nèi)存,所以,要延緩銷毀 。
總結(jié)
以上是生活随笔為你收集整理的Linux学习之系统编程篇:利用 shm 进行进程间通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux学习之系统编程篇:shm 共享
- 下一篇: Linux学习之系统编程篇:信号的基本概