linux java 共享内存_Linux进程间通信之共享内存
一,共享內(nèi)存
內(nèi)核管理一片物理內(nèi)存,允許不同的進程同時映射,多個進程可以映射同一塊內(nèi)存,被多個進程同時映射的物理內(nèi)存,即共享內(nèi)存。
映射物理內(nèi)存叫掛接,用完以后解除映射叫脫接。
1,共享內(nèi)存的特點:
優(yōu)點:是最快的IPC。
缺點:要編程者自己實現(xiàn)對共享內(nèi)存互斥訪問。如何實現(xiàn)?
2,編程模型:具體函數(shù)的用法可以用man手冊查看(強力推薦)
進程A: writeshm.c
1) 獲得key, ftok()
2) 使用key來創(chuàng)建一個共享內(nèi)存 shmget()
3) 映射共享內(nèi)存(得到虛擬地址), shmat()
4) 使用共享內(nèi)存,?往共享內(nèi)存中寫入數(shù)據(jù)
5) 解除映射 shmdt()
6) 如果共享內(nèi)存不再使用,可以使用shmctl()銷毀共享內(nèi)存
進程B: readshm.c
1) 獲得key, ftok()
2) 使用key來獲得一個共享內(nèi)存 shmget()
3) 映射共享內(nèi)存(得到虛擬地址), shmat()
4) 使用共享內(nèi)存,?讀取共享內(nèi)存中的數(shù)據(jù)
5) 解除映射 shmdt()
3,實例
進程A:
//writeshm.c
#include#include#include#include#include#include
intmain()
{//生成一個key
key_t key = ftok("./", 66);//創(chuàng)建共享內(nèi)存,返回一個id
int shmid = shmget(key, 8, IPC_CREAT|0666|IPC_EXCL);if(-1 ==shmid)
{
perror("shmget failed");
exit(1);
}//映射共享內(nèi)存,得到虛擬地址
void *p = shmat(shmid, 0, 0);if((void*)-1 ==p)
{
perror("shmat failed");
exit(2);
}//寫共享內(nèi)存
int *pp =p;*pp = 0x12345678;*(pp + 1) = 0xffffffff;//解除映射
if(-1 ==shmdt(p))
{
perror("shmdt failed");
exit(3);
}
printf("解除映射成功,點擊回車銷毀共享內(nèi)存\n");
getchar();//銷毀共享內(nèi)存
if(-1 ==shmctl(shmid, IPC_RMID, NULL))
{
perror("shmctl failed");
exit(4);
}return 0;
}
進程B:
//readshm.c
#include#include#include#include#include#include
intmain()
{//生成一個key
key_t key = ftok("./", 66);//獲取共享內(nèi)存,返回一個id
int shmid = shmget(key, 0, 0);if(-1 ==shmid)
{
perror("shmget failed");
exit(1);
}//映射共享內(nèi)存,得到虛擬地址
void *p = shmat(shmid, 0, 0);if((void*)-1 ==p)
{
perror("shmat failed");
exit(2);
}//讀共享內(nèi)存
int x = *(int *)p;int y = *((int *)p + 1);
printf("從共享內(nèi)存中都取了:0x%x 和 0x%x \n", x, y);//解除映射
if(-1 ==shmdt(p))
{
perror("shmdt failed");
exit(3);
}return 0;
}
運行結(jié)果:
writeshma:
readshma:
總結(jié)
以上是生活随笔為你收集整理的linux java 共享内存_Linux进程间通信之共享内存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 厂办大集体改制不签字_许昌二印,磨砂技术
- 下一篇: java showinputdialog