The Nine

The Nine 是一名非常热爱编程以及旅游、心理学的青年,Delphi将是The Nine的主要编程语言,如果您的爱好和The Nine相近,那么请关注,如果您需要与我联系,请点击"发信给作者"我会及时和你联系!

System IPC 与Posix IPC(共享内存)

系统v(共享内存)

 

1.对于系统V共享内存,主要有以下几个API:shmget()、shmat()、shmdt()及shmctl()。

 

2.shmget()用来获得共享内存区域的ID,如果不存在指定的共享区域就创建相应的区域。

shmat()把共享内存区域映射到调用进程的地址空间 中去,这样,进程就可以方便地对共享区域进行访问操作。

shmdt()调用用来解除进程对共享内存区域的映射。

shmctl实现对共享内存区域的控制操 作。

这里我们不对这些系统调用作具体的介绍,读者可参考相应的手册页面,后面的范例中将给出它们的调用方法。

注:shmget的内部实现包含了许多重要的系统V共享内存机制;shmat在把共享内存区域映射到进程空间时,并不真正改变进程的页 表。当进程第一次访问内存映射区域访问时,会因为没有物理页表的分配而导致一个缺页异常,然后内核再根据相应的存储管理机制为共享内存映射区域分配相应的 页表。

3、系统V共享内存限制

在/proc/sys/kernel/目录下,记录着系统V共享内存的一下限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做。

#include <sys/ipc.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>

#include <string.h>
typedef struct {
    char name[4];
    int age;
}people;


int main(int argc,char *argv[]){

    int shm_id ,i;
    key_t key;
    char temp;
    people *p_map;
    char* name = "./myshm";
    key = ftok(name,0);
    if(key==-1){
        perror("ftok error!");
    }
    shm_id = shmget(key,4096,IPC_CREAT);
    if(shm_id ==-1){
        perror("shmget error");
    }
    p_map = (people*)shmat(shm_id,NULL,0);
    temp = 'a';
    for(i = 0;i<10;i++)
    {
        temp +=1;
        memcpy((*(p_map +i )).name,&temp, 1);
        (*(p_map + i)).age = 20+i;
    }
    
    if(shmdt(p_map)==-1)
        perror("detach error");
}

 

 

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

typedef struct {
    char name[4];
    int  age;
}people;
int main(int argc,char *argv[]){
    int shm_id ,i;
    key_t key;
    char temp;
    people *p_map;
    char* name = "./myshm";
    key = ftok(name,0);
    if(key==-1){
        perror("ftok error!");
    }
    shm_id = shmget(key,4096,IPC_CREAT);
    if(shm_id ==-1){
        perror("shmget error");
    }
    p_map = (people*) shmat(shm_id,NULL,0);
    for(i = 0;i<10;i++){
        printf("Name: %s,Age: %d\n",(*(p_map+i)).name,(*(p_map+i)).age);
    }
    if(shmdt(p_map)==-1)
    {
        perror("detach error");
    }
}

 

 

评论
热度(1)

© The Nine | Powered by LOFTER