共享內存
共享內存是被多個進程共享的一部分物理內存.共享內存是進程間共享數據的一種最快的方法,一個進程向共享內存區域寫入了數據,共享這個內存區域的所有進程就可以立刻看到其中的內容。
實現共享內存的步驟
共享內存實現分爲兩個步驟:
一、創建共享內存,使用shmget函數;
二、映射共享內存,將這段創建的共享內存映射到具體的進程空間去,使用shmat函數。
創建
int shmget ( key_t key, int size, int shmflg )
key標識共享內存的鍵值: 0/IPC_PRIVATE。 當key的取值爲IPC_PRIVATE,則函數shmget()將創建一塊新的共享內存;如果key的取值爲0,而參數shmflg中又設置IPC_PRIVATE這個標誌,則同樣會創建一塊新的共享內存。
返回值:如果成功,返回共享內存標識符;如果失敗,返回-1。
映射
char * shmat ( int shmid, char *shmaddr, int flag)
參數:
shmid:shmget函數返回的共享存儲標識符
flag:決定以什麼方式來確定映射的地址(通常爲0)
返回值:
如果成功,則返回共享內存映射到進程中的地址;如果失敗,則返回- 1
脫離
當一個進程不再需要共享內存時,需要把它從進程地址空間中脫離。
int shmdt ( char *shmaddr )
小程序
write.c
#include<stdio.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int shmid = shmget((key_t)1234, 100, IPC_CREAT);
if (-1 == shmid)
{
perror("shmget");
exit(1);
}
char *ptr = (char *)shmat(shmid, NULL, 0);
if ((void *)-1 == ptr)
{
perror("shmat");
exit(2);
}
memset(ptr, 0, 100);
char *str = "hello";
//memcpy(ptr, str, strlen(str));
if (-1 == shmdt(ptr))
{
perror("shmdt");
exit(3);
}
return 0;
}
read.c
#include<stdio.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int shmid = shmget((key_t)1234, 100, IPC_CREAT);
if (-1 == shmid)
{
perror("shmget");
exit(1);
}
char *ptr = (char *)shmat(shmid, NULL, 0);
if ((void *)-1 == ptr)
{
perror("shmat");
exit(2);
}
char buffer[100] = {0};
memcpy(buffer, ptr, 100);
printf("%s\n", buffer);
if (-1 == shmdt(ptr))
{
perror("shmdt");
exit(3);
}
return 0;
}