Linux进程间通信——共享内存

相关系统调用

1.创建/打开已存在共享内存区——shmget()

    shmget(key, size, flag);

    返回内存区标识号。

2.映射共享内存区和进程虚拟地址空间——shmat()

    shmat(id, addr, flag);

    返回映射地址。

    id:由shmget()返回,用来标识某共享内存区。

    addr:用户希望映射到哪块虚拟地址,通常设为NULL。

    flag:规定对此区是否是只读等性质。

3.断开映射——shmdt()

    shmdt(addr);

    addr:shmat()所返回的虚拟地址。

4.控制对共享内存区的各种操作——shmctl()

    shmctl(id, cmd, shmstatbuf);

    id:shmget()返回的标识号。

    cmd:要进行的操作类型,如IPC_RMID删除共享内存区。

    shmstatbuf:一个结构体,用来修改或获取内存区当前状态,当cmd为IPC_RMID时,设置为NULL。


代码实现

写者程序

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

#define SHMKEY 741
int shmid;

int main(){
    int i;
    unsigned int *addr1;
    int *p;

    ///creat a shared memory section
    shmid = shmget(SHMKEY, 4*1024, 0777|IPC_CREAT);
    ///link
    addr1 = shmat(shmid, NULL, 0);
    printf("addr1 = 0x%x\n", addr1);

    p = addr1;

    for(i = 255; i < 899; i++){
        *p++ = i;
    }

}

读者程序


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

#define SHMKEY 741
int shmid;

int main(){
    int i;
    unsigned int *addr2;
    int *p;

    ///creat a shared memory section
    shmid = shmget(SHMKEY, 4*1024, 0777|IPC_CREAT);
    ///link
    addr2 = shmat(shmid, NULL, 0);
    printf("addr2 = 0x%x\n", addr1);

    p = addr2;

    for(i = 255; i < 899; i++){
        printf("%d\t", *p++);
    }

    ///delete shared memory section
    shmctl(shmid, IPC_RMID, NULL);

    return 0;
}



猜你喜欢

转载自blog.csdn.net/adobemomo/article/details/80042062