使用共享記憶體(物理記憶體)的步驟:
1、建立共享記憶體
2、對映到虛擬位址空間
3、把資料寫到共享記憶體
4、解除對映並銷毀
為避免同一時間多個程序訪問同一記憶體,我們必須給共享記憶體加鎖,實現程序同步。
加鎖過程:
1、建立訊號量
2、初始化訊號量
3、進行p操作(拔鑰匙)和v操作(插鑰匙)
4、程式執行結束後銷毀
**段如下:
共享程序一:
#include #include #include #include #include #include #include #define shmkey 1234
#define shmsize 4096 //以頁為單位分配共享記憶體
#define semkey 1234
union semun ;
void sem_p(int semid)
}void sem_v(int semid)
}int main()
semid = semget(semkey, 1, ipc_creat | ipc_excl); //建立訊號量
if (semid == -1)
union semun unsem;
unsem.val = 1; //初始化成二值訊號量
ret = semctl(semid, 0, setval, unsem); //初始化訊號量
if (-1 == ret)
shmaddr = shmat(shmid, null, 0); //對映到虛擬位址空間
if (null == shmaddr)
*(int *)shmaddr = count; //資料寫到共享記憶體
while (1)
printf("process a : count = %d\n", count);
count++;
*(int *)shmaddr = count; //寫回共享記憶體
sem_v(semid); //v操作 加一操作 插鑰匙
} shmdt(shmaddr); //解除對映
shmctl(shmid, ipc_rmid, null);
semctl(semid, 0, ipc_rmid);
return 0;
}
共享程序2:
#include #include #include #include #include #include #include #define shmkey 1234
#define shmsize 4096 //以頁為單位分配共享記憶體
#define semkey 1234
union semun ;
void sem_p(int semid)
}void sem_v(int semid)
}int main()
semid = semget(semkey, 1, 0); //建立訊號量
if (semid == -1)
shmaddr = shmat(shmid, null, 0); //對映到虛擬位址空間
if (null == shmaddr)
while (1)
printf("process b : count = %d\n", count);
count++;
*(int *)shmaddr = count; //寫回共享記憶體
sem_v(semid); //v操作 加一操作 插鑰匙
} shmdt(shmaddr); //解除對映
return 0;
}
程序間通訊是什麼?如何實現程序間的通訊
include intpipe fd 2 匿名管道 include include include include intmain int id fork 建立程序 if id 0 父程序 buf s 0 將讀到的最後乙個字元的後乙個字元設定為 0,方便列印 printf s n buf else ...
程序間通訊如何加鎖
程序間通訊有一種 共享記憶體 方式,大家有沒有想過,這種通訊方式中如何解決資料競爭問題?我們可能自然而然的就會想到用鎖。但我們平時使用的鎖都是用於解決執行緒間資料競爭問題,貌似沒有看到過它用在程序中,那怎麼辦?關於程序間的通訊方式估計大多數人都知道,這也是常見的面試八股文之一。關於程序間通訊方式和優...
android Aidl 實現程序間通訊
1 android 新建aidl 檔案 刪除void basictypes int anint,long along,boolean aboolean,float afloat,double adouble,string astring 這個方法沒用到 還需要實現。2,新增自己需要的方法例如 pac...