进程间通信--共享内存

本文介绍了一个简单的共享内存创建和操作示例,通过C语言代码展示了如何利用系统调用创建、连接及断开共享内存段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值