代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main(void *arg)
{
int shmid = -1;
shmid = shmget(0x0002, 256, 0644 | IPC_CREAT | IPC_EXCL);//获取内存分配的进程id
if (-1 == shmid)
{
perror("create shm failed ...");
return(-1);
}
printf("create shm ok\n");
char *buf = NULL;
buf = (char *)shmat(shmid, NULL, SHM_RND); //共享内存同进程关联,并获取共享内存文件描述符buf.
if ((char *)-1 == buf)
{
perror("shmat failed ...");
return(-1);
}
memcpy(buf, "hello world", sizeof("hello world"));
printf("buf is: %s\n", buf);
getchar(); //暂停一下进程,回车键继续执行
shmdt(buf);//shimid共享内存同进程脱离
printf("finish dt \n");
getchar();//暂停一下进程,回车键继续执行
int ret = shmctl(shmid, IPC_RMID, NULL); //把shimid共享内存标志为即将删除,当操作过它的进程都退出时,系统会删除该共享内存
if ((void *)-1 == buf)
{
perror("shmctl failed ...");
return(-1);
}
return 0;
}
结果:
注意shmdt(), shmctl(),两个函数执行后nattch的变化