目录一、共享内存二、相关函数1、shmget函数2、shmat函数3、shmdt函数4、shmctl函数四、其它的操作命令原文链接:https://www.cnblogs.com/wucongzhou/p/12497864.html一、共享内存共享内存Shared Memory就是允许多个进程访问同一个内存空间是在多个进程之间共享和传递数据最高效的方式。操作系统将不同进程之间共享内存安排为同一段物理内存进程可以将共享内存连接到它们自己的地址空间中如果某个进程修改了共享内存中的数据其它的进程读到的数据也将会改变。共享内存并未提供锁机制也就是说在某一个进程对共享内存的进行读写的时候不会阻止其它的进程对它的读写。如果要对共享内存的读/写加锁可以使用信号量。二、相关函数Linux中提供了一组函数用于操作共享内存程序中需要包含以下头文件#includesys/ipc.h#includesys/shm.h1、shmget函数shmget函数用来获取或创建共享内存它的声明为intshmget(key_t key,size_t size,intshmflg);key是共享内存的键值是一个整数typedef unsigned int key_t是共享内存在系统中的编号不同共享内存的编号不能相同这一点由程序员保证。key用十六进制表示比较好。size是待创建的共享内存的大小以字节为单位。shmflg是共享内存的访问权限与文件的权限一样0666|IPC_CREAT表示全部用户对它可读写如果共享内存不存在就创建一个共享内存。2、shmat函数把共享内存连接到当前进程的地址空间。它的声明如下void*shmat(intshm_id,constvoid*shm_addr,intshmflg);shm_id是由shmget函数返回的共享内存标识。shm_addr指定共享内存连接到当前进程中的地址位置通常为空表示让系统来选择共享内存的地址。shm_flg是一组标志位通常为0。调用成功时返回一个指向共享内存第一个字节的指针如果调用失败返回-1.3、shmdt函数该函数用于将共享内存从当前进程中分离相当于shmat函数的反操作。它的声明如下intshmdt(constvoid*shmaddr);参数shmaddr是shmat函数返回的地址。调用成功时返回0失败时返回-1.4、shmctl函数删除共享内存它的声明如下intshmctl(intshm_id,intcommand,structshmid_ds*buf);shm_id是shmget函数返回的共享内存标识符。command填IPC_RMID。buf填0。解释一下shmctl是控制共享内存的函数其功能不只是删除共享内容但其它的功能没什么用所以不介绍了。注意用root创建的共享内存不管创建的权限是什么普通用户无法删除。/* * 程序名book258.cpp此程序用于演示共享内存的用法 * 作者C语言技术网(www.freecplus.net) 日期20190525 */#includestdio.h#includestring.h#includeunistd.h#includesys/ipc.h#includesys/shm.h//#include _public.hintmain(){intshmid;// 共享内存标识符// 创建共享内存键值为0x5005共1024字节。if((shmidshmget((key_t)0x5005,1024,0640|IPC_CREAT))-1){printf(shmat(0x5005) failed\n);return-1;}char*ptext0;// 用于指向共享内存的指针// 将共享内存连接到当前进程的地址空间由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; }}四、其它的操作命令用ipcs -m可以查看系统的共享内存内容有键值key共享内存编号shmid创建者owner权限perms大小bytes。用ipcrm -m 共享内存编号可以手工删除共享内存