1.进程1代码:
#include
#include
#include
#include
intmain()
{
void* shm = NULL;
int shmid;
shmid = shmget(1314,10,0666|IPC_CREAT);
if(-1 == shmid)
{
printf("shmgeterror\n");
return -1;
}
shm = shmat(shmid,0,0);
if((void*)-1 == shm)
{
printf("shmaterror\n");
return -1;
}
sprintf((char*)shm,"%s","hello");
if(-1 == shmdt(shm))
{
printf("shmdterror\n");
return -1;
}
return 0;
}
2.进程2代码:
#include
#include
#include
#include
intmain()
{
void* shm = NULL;
int shmid;
shmid = shmget(1314,10,0666|IPC_CREAT);
if(-1 == shmid)
{
printf("shmgeterror\n");
return -1;
}
shm = shmat(shmid,0,0);
if((void*)-1 == shm)
{
printf("shmaterror\n");
return -1;
}
printf("%s\n",(char*)shm);
if(-1 == shmctl(shmid,IPC_RMID,NULL))
{
printf("shmctlerror\n");
return -1;
}
return 0;
}
1. 相关包含头文件:
#include
#include
#include
2.shmget
函数作用:得到一个共享内存标识符或创建一个共享内存对象。
原型:intshmget(key_t key, size_t size, int shmflg)
返回值:成功返回共享内存的标识符,出错返回-1.
3. shmat
函数作用:把共享内存区对象映射到调用进程的地址空间。
原型:void *shmat(intshmid, const void *shmaddr, int shmflg)
返回值:成功返回附加好的共享内存地址,出错返回-1.
4. shmdt
函数作用:断开共享内存连接。
原型:int shmdt(constvoid *shmaddr)
返回值:成功返回0,出错返回-1.
5. shmctl
函数作用:共享内存管理
原型:int shmctl(intshmid, int cmd, struct shmid_ds *buf)
返回值:成功返回0,出错返回-1.
1. shell中可以查看和释放已分配的共享内存。
2. ipcs命令
不加参数,会显示出共享内存,信号量,消息队列;
-m参数,只显示共享内存;
例如:
root@ubuntu:/usr/study# ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000522 65536 root 666 10 0
------ Semaphore Arrays --------
key semid owner perms nsems
------ Message Queues --------
key msqid owner perms used-bytes messages
root@ubuntu:/usr/study# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000522 65536 root 666 10 0
3.ipcrm命令
删除共享内存。
root@ubuntu:/usr/study#ipcs -m
------ SharedMemory Segments --------
key shmid owner perms bytes nattch status
0x0000052265536 root 666 10 0
root@ubuntu:/usr/study#ipcrm -m 65536
root@ubuntu:/usr/study#ipcs -m
------ SharedMemory Segments --------
key shmid owner perms bytes nattch status
4.释放所有已分配的共享内存
ipcs -m | awk '$2 ~ /[0-9]+/ {print $2}' | while read s; dosudo ipcrm -m $s; done