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);
}