本文介绍两个进程间通信的方法之一,共享内存(linux)。
共享内存是由 IPC 为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中
其他进程可以
将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址
就好像它们是
由 malloc 分配的一样。如果一个进程向共享内存写入数据,所做的更改立刻被可以访问同
一段共享内存的任何
其进程看到。
共享内存本身不存在同步机制。对共享内存访问的同步机制须有程序员控制。
共享内存中主要函数:shmget ,负责创建共享内存。
int shmget(key_t key, size_t size, int shmflg);
shmat 函数
连接共享内存到进程自己的地址空间。
void *shmat(int shm_id, const void* shm_addr, int shm_flag );
shmdt 函数
与上面的函数相反,作用是把共享内存从当前进程中分离。注意分离并不是删除。
shmctl 函数
共享内存控制函数。
int shmctl(int shm_id, //返回的共享内存标识符
int command,//要采取的动作,有三个动作(IPC_STAT,IPC_SET,IPC_RMID)
struct shmid_ds *buf //buf 为指针,指向包含共享内存模式和访问权限的结构。
);
shmid_ds 结构成员有至少以下内容
struct shmid_ds
{
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
};
以下为一个实例,两个进程通过共享内存读写信息。参考 Neil 和 Richard 的 beginning linux
programming
#共用头文件 shm_com.h
#define TEXT_SIZE 2048
struct shared_use_st
{
int written_by_you;
char some_text[TEXT_SIZE];
};
#消费者进程
share_mem1.c
#include <stdio.h>
#include <stdlib.h>