从C到C++(十一)

199 阅读2分钟

本文已参与 ⌈新人创作礼⌋ 活动,一起开启掘金创作之路。

十一、Linux共享内存

示例程序:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h> 

int main()
{
  int shmid; // 共享内存标识符
 
  // 创建共享内存,键值为0x5005,共1024字节。
  if ( (shmid = shmget((key_t)0x500510240640|IPC_CREAT)) == -1)
  { printf("shmat(0x5005) failed\n"); return -1; }
   
  char *ptext=0;   // 用于指向共享内存的指针
 
  // 将共享内存连接到当前进程的地址空间,由ptext指针指向它
  ptext = (char *)shmat(shmid, 00);
 
  // 操作本程序的ptext指针,就是操作共享内存
  printf("写入前:%s\n",ptext);
  sprintf(ptext,"本程序的进程号是:%d",getpid());
  printf("写入后:%s\n",ptext);
 
  // 把共享内存从当前进程中分离
  shmdt(ptext);
   
  // 删除共享内存
  // if (shmctl(shmid, IPC_RMID, 0) == -1)
  // { printf("shmctl(0x5005) failed\n"); return -1; }
}

shmget函数用来获取或创建共享内存,int shmget(key_t key, size_t size, int shmflg); key是共享内存的键值,是一个整数,typedef unsigned int key_t是共享内存在系统中的编号,不同共享内存的编号不能相同,这一点由程序员保证。key用十六进制表示比较好。size是待创建的共享内存的大小,以字节为单位。shmflg是共享内存的访问权限,与文件的权限一样,0666|IPC_CREAT表示全部用户对它可读写,如果共享内存不存在,就创建一个共享内存。

shmat函数是把共享内存连接到当前进程的地址空间。 void *shmat(int shm_id, const void *shm_addr, int shmflg); shm_id是由shmget函数返回的共享内存标识。shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。shm_flg是一组标志位,通常为0。调用成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1。

shmdt函数用于将共享内存从当前进程中分离,相当于shmat函数的反操作。 int shmdt(const void *shmaddr);shmaddr是shmat函数返回的地址。 调用成功时返回0,失败时返回-1。

shmctl函数用来删除共享内存。int shmctl(int shm_id, int command, struct shmid_ds *buf); shm_id是shmget函数返回的共享内存标识符。command填IPC_RMID。buf填0。

本文转载于: 版权所有 (c) 2008-2020,码农有道,C语言技术网(www.freecplus.net)