正如实现信号量的方式有SystemV 和Posix两种形式,
实现共享内存也有SystemV 和Posix两种形式,参考该文和该文 和该文
一、Posix形式:(常用)
i
用到如下函数:
shm_open
mmap
ftruncate
shm_unlink
二、System V 形式:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#define MEMSIZE 1024
int main()
{
//ftok();//有血缘关系的进程,我们不关心key值,可以不用,使用匿名IPC。即shmget中使用IPC_PRIVATE
char *ptr = NULL;
shmid = shmget(IPC_PRIVATE,MEMSIZE,0600);
if(shmid<0)
{
perror("shmget()");
exit(1);
}
pid = fork();
if(pid<0)
{
perror("fork()");
exit(1);
}
if(pid == 0) //子进程
{
ptr = shmat(shmid,NULL0);
if(ptr = (void*)-1)
{
perror("shmat()");
exit(1);
}
strcpy(ptr,"hello");
shmdt(ptr);//子进程解除映射
exit(0);
}
else //父进程
{
wait(NULL);//收尸,因为没有用到阻塞的系统调用,放在这能确保子进程写完。
ptr = shmat(shmid,NULL,0);
if(ptr== (void*)-1)
{
perror("shmat");
exit(1);
}
puts(ptr);
shmdt(ptr);
shmctl(shmid,IPC_RMID,NULL);//因为是销毁,故第3个参数为NULL
exit(0);
}
用到如下函数:
shm_get()
shm_at();
shm_dt();
shm_ctl();