1.创建
#include <sys/shm.h>
int shmget(key_t key,size_t size,int flag);
当打开一个内存段时,参数size的值为0。
//ceate_shm.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#define BUFSZ 4096
int main()
{
int shm_id;
shm_id=shmget(IPC_PRIVATE,BUFSZ,0666);
if(shm_id<0){
perror("shmget");
exit(1);
}
printf("successfully created segment: %d/n",shm_id);
system("ipcs -m");
return 0;
}
结果:
alei@alei-desktop:~/linux/code/14$ gcc create_shm.c -o create_shm
alei@alei-desktop:~/linux/code/14$ ./create_shm
successfully created segment: 786451
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 0 alei 600 393216 2 dest
0x00000000 32769 alei 600 393216 2 dest
0x00000000 65538 alei 600 393216 2 dest
0x00000000 98307 alei 600 393216 2 dest
0x00000000 131076 alei 600 393216 2 dest
0x00000000 163845 alei 600 393216 2 dest
0x00000000 196614 alei 600 393216 2 dest
0x00000000 229383 alei 600 393216 2 dest
0x00000000 262152 alei 600 393216 2 dest
0x00000000 294921 alei 600 393216 2 dest
0x00000000 327690 alei 600 393216 2 dest
0x00000000 360459 alei 600 393216 2 dest
0x00000000 393228 alei 600 393216 2 dest
0x00000000 425997 alei 600 393216 2 dest
0x00000000 458766 alei 600 393216 2 dest
0x00000000 557071 alei 600 176400 2 dest
0x00000000 589840 alei 600 358620 2 dest
0x00000000 720913 alei 600 393216 2 dest
0x00000000 753682 alei 600 393216 2 dest
0x00000000 786451 alei 666 4096 0
2.共享内存的操作
使用如下函数:
#include <sys/shm.h>
int shmctl(int shm_id,int cmd,struct shmid_ds * buf);
使用shmat将一个存在的共享内存段连接到本进程空间:
#include <sys/shm.h>
void * shmat(int shm_id,const void * addr,int flag);
使用shmdt函数,将指定的共享内存段从本进程的空间中脱离出去。
#include <sys/shm.h>
int shmdt(void * addr);
//opr_shm.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
int main ( int argc, char *argv[] )
{
int shm_id ;
char * shm_buf;
if ( argc != 2 ){
printf ( "USAGE: atshm <identifier>" );
exit (1 );
}
shm_id = atoi(argv[1]);
if ( (shm_buf = shmat( shm_id, 0, 0)) < (char *) 0 ){
perror ( "shmat" );
exit (1);
}
printf ( " segment attached at %p/n", shm_buf ); //输出导入的位置
system("ipcs -m");
sleep(3);
if ( (shmdt(shm_buf)) < 0 ) {
perror ( "shmdt");
exit(1);
}
printf ( "segment detached /n" );
system ( "ipcs -m " );
exit ( 0 );
}
结果:
alei@alei-desktop:~/linux/code/14$ gcc opr_shm.c -o opr_shm
alei@alei-desktop:~/linux/code/14$ ./opr_shm
USAGE: atshm <identifier>alei@alei-desktop:~/linux/code/14$ ./opr_shm 786451
segment attached at 0xb7f11000
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 0 alei 600 393216 2 dest
0x00000000 32769 alei 600 393216 2 dest
0x00000000 65538 alei 600 393216 2 dest
0x00000000 98307 alei 600 393216 2 dest
0x00000000 131076 alei 600 393216 2 dest
0x00000000 163845 alei 600 393216 2 dest
0x00000000 196614 alei 600 393216 2 dest
0x00000000 229383 alei 600 393216 2 dest
0x00000000 262152 alei 600 393216 2 dest
0x00000000 294921 alei 600 393216 2 dest
0x00000000 327690 alei 600 393216 2 dest
0x00000000 360459 alei 600 393216 2 dest
0x00000000 393228 alei 600 393216 2 dest
0x00000000 425997 alei 600 393216 2 dest
0x00000000 458766 alei 600 393216 2 dest
0x00000000 557071 alei 600 176400 2 dest
0x00000000 589840 alei 600 358620 2 dest
0x00000000 851985 alei 600 393216 2 dest
0x00000000 884754 alei 600 393216 2 dest
0x00000000 786451 alei 666 4096 1
0x00000000 819220 alei 600 393216 2 dest
segment detached
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 0 alei 600 393216 2 dest
0x00000000 32769 alei 600 393216 2 dest
0x00000000 65538 alei 600 393216 2 dest
0x00000000 98307 alei 600 393216 2 dest
0x00000000 131076 alei 600 393216 2 dest
0x00000000 163845 alei 600 393216 2 dest
0x00000000 196614 alei 600 393216 2 dest
0x00000000 229383 alei 600 393216 2 dest
0x00000000 262152 alei 600 393216 2 dest
0x00000000 294921 alei 600 393216 2 dest
0x00000000 327690 alei 600 393216 2 dest
0x00000000 360459 alei 600 393216 2 dest
0x00000000 393228 alei 600 393216 2 dest
0x00000000 425997 alei 600 393216 2 dest
0x00000000 458766 alei 600 393216 2 dest
0x00000000 557071 alei 600 176400 2 dest
0x00000000 589840 alei 600 358620 2 dest
0x00000000 851985 alei 600 393216 2 dest
0x00000000 884754 alei 600 393216 2 dest
0x00000000 786451 alei 666 4096 0
0x00000000 819220 alei 600 393216 2 dest