日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux学习之系统编程篇:利用 shm 进行进程间通信

發(fā)布時間:2024/9/30 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。