IPC之共享内存(3)

来源:互联网 发布:游戏程序员必看书籍 编辑:程序博客网 时间:2024/06/14 07:29

1、共享内存

共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存写入一段数据,共享这个区域的所有进程就能立刻共享其中的内容。

这里写图片描述


2、共享内存实现

(1)创建共享内存,使用shmget函数。

#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);

key:当 key 取值为 IPC_PRIVATE时,则函数shmget()
将创建一段新的共享内存;如果 key 取值为0,而参数 shmflg 被设置为 IPC_PRIVATE 这个标志,则同样会创建一段新的共享内存。
返回值:如果成功,则返回共享内存标识符;否则返回-1.

(2)映射共享内存,将这段创建的共享内存映射到具体的进程里空间去,使用shmat函数。

#include <sys/shm.h>void *shmat(int shmid, const void *addr, int flag);

shmid:shmget 返回的的共享内存标志符;
flag:决定以什么方式来确定映射的地址(通常为0)

返回值:如果成功,则返回共享内存映射到进程的地址,否则返回-1。

(3)共享内存解除。

#include <sys/shm.h>int shmdt(char *shmaddr);

当一个进程不在需要共享内存时,需要把它从进程地址空间中脱离。

3、父、子进程共享内存

demo:

#include <apue.h>#include <sys/shm.h>#define SHMFLG (S_IRUSR | S_IWUSR)int main(int argc, char *argv[]){    int shmid;    pid_t pid;    char *p_addr;    char *c_addr;    int i;    if (argc == 1){        fprintf(stderr, "Usage : %s [data...]\n", argv[0]);        exit(1);    }    /* 创建共享内存 */    if ((shmid = shmget(IPC_PRIVATE, 1024, SHMFLG)) == -1){        fprintf(stderr, "Create share memory error : %s\n\a", strerror(errno));        exit(1);    }    /* 创建子进程 */    if ((pid = fork()) < 0){        fprintf(stderr, "fork error\n");        exit(1);    }    else if (pid > 0){              // 父进程想共享内存写数据        printf("Parent process writing data to share memory...\n");        p_addr = shmat(shmid, 0, 0);        memset(p_addr, '\0', 1024);        for (i = 1; i < argc; i++){            strcat(p_addr, " ");            strcat(p_addr, argv[i]);        }        waitpid(pid, NULL, 0);        exit(0);    }    else{                           // 子进程从共享内存读数据        sleep(1);                   // 让父进程有足够的时间写数据        c_addr = shmat(shmid, 0, 0);        fprintf(stdout, "Child process reading data form share memory...%s\n", c_addr);        exit(0);    }    exit(0);}

这里写图片描述

原创粉丝点击