哪家做网站的公司,宁波建站模板源码,wordpress 搭建教程 pdf,企业销售型网站是什么Linux 共享内存 1. shmget函数2. shmat函数3. shmdt函数4. shmctl函数5. 注意#xff1a; 多线程共享进程的地址空间#xff0c;如果多个线程需要访问同一块内存#xff0c;用全局变量就可以了。
在多进程中#xff0c;每个进程的地址空间是独立的#xff0c;不共享的 多线程共享进程的地址空间如果多个线程需要访问同一块内存用全局变量就可以了。
在多进程中每个进程的地址空间是独立的不共享的如果多个进程需要访问同一块内存不能用全局变量只能用共享内存。
共享内存Shared Memory允许多个进程不要求进程之间有血缘关系访问同一块内存空间是多个进程之间共享和传递数据最高效的方式。进程可以将共享内存连接到它们自己的地址空间中如果某个进程修改了共享内存中的数据其它的进程读到的数据也会改变。
共享内存没有提供锁机制也就是说在某一个进程对共享内存进行读/写的时候不会阻止其它进程对它的读/写。如果要对共享内存的 读/写 加锁可以使用信号量。
Linux中提供了一组函数用于操作共享内存。
1. shmget函数 该函数用于创建/获取共享内存。 int shmget(key_t key, size_t size, int shmflg);1.key 共享内存的键值是一个整数typedef unsigned int key_t一般采用十六进制例如0x5005不同共享内存的key不能相同。 2.size 共享内存的大小以字节为单位。 3.shmflg 共享内存的访问权限与文件的权限一样例如 0666|IPC_CREAT0666表示全部用户对它可读写IPC_CREAT表示如果共享内存不存在就创建它。 4.返回值成功返回共享内存的id一个非负的整数失败返回-1系统内存不足、没有权限 用ipcs -m可以查看系统的共享内存包括键值key共享内存idshmid拥有者owner权限perms大小bytes。
以下例程来自b站公开课——c中高级工程师码农联盟
#include iostream
#include cstdio
#include cstdlib
#include cstring
#include unistd.h
#include sys/ipc.h
#include sys/shm.h
using namespace std;struct stgirl // 超女结构体。
{int no; // 编号。char name[51]; // 姓名注意不能用string。
};int main(int argc,char *argv[])
{//if (argc!3) { cout Using:./demo no name\n; return -1; }// 第1步创建/获取共享内存键值key为0x5005也可以用其它的值。int shmidshmget(0x5005, sizeof(stgirl), 0640|IPC_CREAT);if ( shmid -1 ){cout shmget(0x5005) failed.\n; return -1;}cout shmid shmid endl;}
执行 demo 程序用 ipcs -m查看共享内存信息 用 ipcrm -m共享内存id可以手工删除共享内存如下
2. shmat函数
创建了共享内存后需要使用共享内存那就需要用到shmat函数了
该函数用于把共享内存连接到当前进程的地址空间。
void *shmat(int shmid, const void *shmaddr, int shmflg);1.shmid 由shmget()函数返回的共享内存标识。 2.shmaddr 指定共享内存连接到当前进程中的地址位置通常填0表示让系统来选择共享内存的地址。 3.shmflg 标志位通常填0。 调用成功时返回共享内存起始地址失败返回(void*)-1。 3. shmdt函数
如果不再使用共享内存使用shmdt函数将共享内存从当前进程中分离。
该函数用于将共享内存从当前进程中分离相当于shmat()函数的反操作
int shmdt(const void *shmaddr);shmaddr shmat()函数返回的地址。 调用成功时返回0失败时返回-1。 #include iostream
#include cstdio
#include cstdlib
#include cstring
#include unistd.h
#include sys/ipc.h
#include sys/shm.h
using namespace std;struct stgirl // 超女结构体。
{int no; // 编号。char name[51]; // 姓名注意不能用string。
};int main(int argc,char *argv[])
{//if (argc!3) { cout Using:./demo no name\n; return -1; }// 第1步创建/获取共享内存键值key为0x5005也可以用其它的值。int shmidshmget(0x5005, sizeof(stgirl), 0640|IPC_CREAT);if ( shmid -1 ){cout shmget(0x5005) failed.\n; return -1;}cout shmid shmid endl;// 第2步把共享内存连接到当前进程的地址空间。stgirl *ptr(stgirl *)shmat(shmid,0,0); // 用stgirl结构体指针指向共享内存的起始地址if ( ptr(void *)-1 ){cout shmat() failed\n; return -1;}// 第3步使用共享内存对共享内存进行读/写。cout 原值no ptr-no ,name ptr-name endl; // 显示共享内存中的原值。ptr - noatoi(argv[1]); // 对超女结构体的no成员赋值。strcpy(ptr-name,argv[2]); // 对超女结构体的name成员赋值。//ptr - nameargv[2];cout 新值no ptr-no ,name ptr-name endl; // 显示共享内存中的当前值。// 第4步把共享内存从当前进程中分离。shmdt(ptr);} 刚开始共享内存中是空的调用的时候写入 12 小美
4. shmctl函数
该函数用于操作共享内存最常用的操作是删除共享内存。
int shmctl(int shmid, int command, struct shmid_ds *buf);1.shmid shmget()函数返回的共享内存id。 2.command 操作共享内存的指令如果要删除共享内存填IPC_RMID。 3.buf 操作共享内存的数据结构的地址如果要删除共享内存填0。 调用成功时返回0失败时返回-1。 注意用root创建的共享内存不管创建的权限是什么普通用户无法删除。
5. 注意
共享内存的数据结构可以用结构体或者数组但是只能用C内置的数据类型不能使用STL容器因为STL容器会动态的在堆区分配内存而在堆区分配的内存不属于共享内存