当前位置:首页 > 内存 > 正文

Linux 共享内存(Linux7需要设置共享内存吗)

  • 内存
  • 2024-05-06 06:38:58
  • 1277

一、linux查看共享内存命令共享内存显示
使用不带任何参数的ipcs命令,将会打印共享内存、信号量、消息队列的所有信息。如果只想显示共享内存信息,使用以下命令:
[root@localhost~]#ipcs-m
-----SharedMemorySegments--------
keyshmidownerpermsbytesnatchstatus
0x000000001867776root6003932162dest0000000032162last
0x000300211703938zc66661311041
x0003802e1736707zc66613110410x0003000417694666613110410x000380022245ZC6666666131104410x00000000193318root6003932162DEST
0x000000001966087ROOT60039321621998856Root6003932162Dest
0x00000000002031625ROOT6003932162DEST
0x00000000002064394ROOT6003932162DEST
0x0014350C2261003CS66633544322Enden
号第三列是创建用户的所有者;
第四列是授权权限;
第五列是创建的大小(以字节为单位);
第六列是连接的进程数到nattach共享内存;
第七列是共享内存状态。显示“dest”表示该共享内存段已被删除,但仍有用户在使用。当内存段模式字段设置为SHM_DEST时,将显示“dest”。当用户调用IPC_RMIDshmctl时,内存首先检查有多少进程与此内存关联,如果关联数为0,则此共享内存将被销毁,此内存的模式位被设置为SHM_DEST。如果所有进程都没有使用它,则该共享内存将被删除。


二、架构师进阶:Linux进程间如何共享内存共享内存IPC原理
共享内存进程间通信机制主要用于实现进程间的大量数据传输。
640
共享内存是最近一次内存访问时单独访问的一段内存空间。数据结构定义如下:
a/usr/include/linux/shm.h
structipc_permshm_perm;/*操作权限*/
intshm_segsz;/*sizeofsegment(bytes)段长度大小*/
__kernel_time_tshm_atime;/*lastattachtime最近时间*/
__kernel_time_tshm_dtime;/*lastdetachtime最近时间*/
__kernel_time;/tshm_ctimepidofcreator创建者pid*/
__kernel_ipc_pid_tshm_lpid;/*pidoflaster慢速运行pid*/
unsignedshortshm_nattch;/*entattaches*/
*/*pidoflaster慢速运行pid*/
unsignedshortshm_nattch;/*当前附件数量*/
unsignedshortshm_unused;/*兼容性*/
empty*shm_unused2;/*ditto-usedbyDIPC*/
empty*shm_unused3;/*不寻常*/|
};
两个进程使用这个在共享内存空间之前,需要在电子空间和共享内存空间之间建立连接,即将共享内存空间挂载在过程。系统对共享内存有以下限制:字节)*/
#defineSHMMNI4096/*maxnumofsegssystemwide*/
#defineSHMALL(SHMMAX/getpagesize()*(SHMMNI/16)))|。h>#include
/*
*第一个参数是键的值,通常是ftok()函数
*include
*第二个参数是内存部分大小的值(单位:字节)
*第三个参数标识创建什么共享内存段
*/
intshmget(key_tkey,size_tsize,intshmflg);
2.*第一个参数为操作的公共内存标识符
*第二个参数为要执行的操作
*第三个参数为临时公共内存变量数据结构shmid_ds
*/
intshmctl(intshmid,intcmd,structshmid_ds*buf);
3.数据段中调用进程共享的内存段,并返回内存空间的首地址。其函数声明如下:
#include
#include
/*
*第一个参数是操作的共享内存标识符
*第二个参数用于指定共享内存的指定地址。>*/
空*shmat(intshmid,constvoide*shmaddr,intshmflg);
4.我们需要调用shmdt()函数将其从进程中删除。该函数声明如下:
#include
#include
/*
*参数第一个分配的共享内存的地址
*/
intshmdt(constvoid*shmaddr);
遵循父子之间共享内存的约定。流程
1.使用fork()函数创建子进程后,该进程继承父进程的共享内存。
2.
3.如果在进程上调用exit()函数,则所有共享内存都将与当前进程断开连接。
程序示例
设置一段共享内存,父进程将整个文件存储在首地址,子进程读取它。
#include
#include
#include
#include
#include
#include
#defineSHM_SIZE1024
intmain()
{
intshm_id,pid;
int*ptr=NULL;
/*申请共享内存*/<
shm_id=shmget((key_t)1004,SHM_SIZE,IPC_CREAT|0600);
/*进程地址空间的表共享内存*/
ptr=(int*)shmat(shm_id,0,0);
printf("Attachaddris%p",ptr);
*ptr=1004;

if((pid=fork())==-1){
perror("forkErr");
exit(0);
}
elseif(!pid){
printf("TheValueofChildis:%d"
somdt(0);
}else{
somnt(1);
/*unmap*/
shmdt(ptr);
/*删除共享内存*/
shmctl(shm_id,IPC_RMID,0);
}
return0
}
输出事件:
640