汽车品牌,免费音乐下载,阙-朝九晚六早班车,每日创投新闻速递,填补咨询面包

admin 2019-06-24 阅读:201


导读同享内存是在内存中独自拓荒的一段内存空间,这段内存空间有自己特有的数据结构,包含拜访权限、巨细和最近拜访的时刻等。

同享内存 IPC 原理

同享内存进程间通讯机制首要用于完成进程间很多的数据传输,下图所示为进程间运用同享内存完成很多数据传输的示意图:

同享内存是在内存中独自拓荒的一段内存空间,这段内存空间有自己特有的数据结构,包含拜访权限、巨细和最近拜访的时刻等。该数据结构界说如下:

from /usr/include/linux/shm.h
struct shmid_ds {
struct ipc_perm shm_perm; /* operation perms 操作权限 */
int shm_segsz; /* size of segment (bytes) 段长度巨细 */
__kernel_time_t shm_atime; /* last attach time 最近attach时刻 */
__kernel_time_t shm_dtime; /* last detach time 最近detach时刻 */
__kernel_time_t shm_ctime; /* last change time 最近change时刻 */
__kernel_ipc_pid_t shm_cpid; /* pid of creator 创立者pid */
__kernel_ipc_pid_t shm_lpid; /* pid of last operator 最近操作pid */
unsigned short shm_nattch; /* no. of current attaches */
unsigned short shm_unused; /* compatibility */
void *shm_unused2; /* ditto - used by DIPC */
void *shm_unused3; /* unused */|
};

两个进程在运用此同享内存空间之前,需求在进程地址空间与同享内存空间之间树立联络,行将同享内存空间挂载到进程中。

体系对同享内存做了以下约束:

#define SHMMAX 0x2000000 /* max shared seg size (bytes) 最大同享段巨细 */

#define SHMMIN 1 /* min shared seg size (bytes) 最小同享段巨细 */

#define SHMMNI 4096 /* max num of segs system wide */

#define SHMALL (SHMMAX/getpagesize()*(SHMMNI/16))|

define SHMSEG SHMMNI /* max shared segs per process */

Linux 同享内存办理

1.创立同享内存

#include <sys/ipc.h> #include <sys/shm.h>

/*
* 第一个参数为 key 值,一般由 ftok() 函数发生
* 第二个参数为欲创立的同享内存段巨细(单位为字节)
* 第三个参数用来标识同享内存段的创立标识
*/

int shmget(key_t key, size_t size, int shmflg);

2.同享内存操控

#include <sys/ipc.h> #include <sys/shm.h>

/*
* 第一个参数为要操作的同享内存标识符
* 第二个参数为要履行的操作
* 第三个参数为 shmid_ds 结构的暂时同享内存变量信息
*/

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

3.映射同享内存目标

体系调用 shmat() 函数完成将一个同享内存段映射到调用进程的数据段中,并回来内存空间首地址,其函数声明如下:

#include <sys/types.h>

#include <sys/shm.h>

/*
* 第一个参数为要操作的同享内存标识符
* 第二个参数用来指定同享内存的映射地址,非0则为此参数,为0的话由体系分配
* 第三个参数用来指定同享内存段的拜访权限和映射条件
*/

void *shmat(int shmid, const void *shmaddr, int shmflg);

4.别离同享内存目标

在运用结束同享内存空间后,需求运用 shmdt() 函数调用将其与当时进程别离。函数声明如下:

#include <sys/types.h>

#include <sys/shm.h>

/*
* 参数为分配的同享内存首地址
*/

int shmdt(const void *shmaddr);

同享内存在父子进程间遵从的约好

1.运用 fork() 函数创立一个子进程后,该进程承继父亲进程挂载的同享内存。

2.假如调用 exec() 履行一个新的程序,则一切挂载的同享内存将被主动卸载。

3.假如在某个进程中调用了 exit() 函数,一切挂载的同享内存将与当时进程脱离关系。

程序实例

请求一段同享内存,父进程在首地址处存入一整数,子进程读出。

#include

#include <sys/ipc.h>

#include <sys/shm.h>

#include <sys/types.h>

#include

#include

#define SHM_SIZE 1024

int main()

{

int shm_id, pid;

int *ptr = NULL;

/* 请求同享内存 */

shm_id = shmget((key_t)1004, SHM_SIZE, IPC_CREAT | 0600);

/* 映射同享内存到进程地址空间 */

ptr = (int*)shmat(shm_id, 0, 0);

printf("Attach addr is %p \n", ptr);

*ptr = 1004;

printf("The Value of Parent is : %d \n", *ptr);

if((pid=fork()) == -1){

perror("fork Err");

exit(0);

}

else if(!pid){
printf("The Value of Child is : %d \n", *ptr);
exit(0);
}else{
sleep(1);

/* 免除映射 */

shmdt(ptr);

/* 删去同享内存 */

shmctl(shm_id, IPC_RMID, 0);
}
return 0;
}

输出成果:

Linux云核算及运维架构师高薪实战班“2019年07月15日行将开课中,120天冲击Linux运维年薪30万,改变速约~~~~