本文已参与 ⌈新人创作礼⌋ 活动,一起开启掘金创作之路。
十一、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)0x5005, 1024, 0640|IPC_CREAT)) == -1)
{ printf("shmat(0x5005) failed\n"); return -1; }
char *ptext=0; // 用于指向共享内存的指针
// 将共享内存连接到当前进程的地址空间,由ptext指针指向它
ptext = (char *)shmat(shmid, 0, 0);
// 操作本程序的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)