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

共享内存:

共享内存时最快的一种IPC(进程间通信)。顾名思义就是两个不相关的进程访问同一个逻辑内存。

为什么快:管道存在数据的拷贝。通过buffer。而内存共享,直接放入内存中。

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

缺陷:共享内存并没有提供同步机制。也就是说A,B可能同时写入数据,后写的数据会将前面写的数据覆盖掉。所以,我们用信号量对它进行控制。


函数:

头文件:#include <sys/shm.h>

1、shmget函数:⽤用来创建共享内存

      原型:int shmget (key_t key, size_t size, int shmflg)

      参数:1)key是一个键值。

                 2)共享内存大小。

                 3)权限设定,与之前的一致。

       返回值:成功返回成功返回一个非负整数,即该共享内存段的表示码;失败返回-1。

2、shmat函数:用来启动对该共享内存的访问(将这块内存与进程地址关联起来),并把共享内存连接到当前进程的地址空间

      原型:void *shmat(int shm_id, const void *shm_addr, int shmflg);

      参数:1)共享内存段的表示码。

                 2)指定链接的地址。通常为NULL,寓意让系统决定。

                 3)两个可能取值:SHM_RND(与shm_addr联合使用,用来控制共享内存出现的地址)和SHM_RDONLY(使得连接的内存只读)。

       返回值:成功时返回一个地址指针,失败返回-1;

3、shmdt函数:将进程从共享内存中去除

      原型:int shmdt (const void *shmaddr);

      参数:由shmat所返回的指针

      返回值:成功返回0;失败返回-1

      注意:将共享内存段与当前进程脱离不等于删除共享内存段

4、shmctl函数:用于控制共享内存

      原型:int shmctl (int shmid, int cmd, struct shmid_ds *buf);

      参数:1)由shmget返回的共享内存标识码

                 2)将要采取的动作(有三个可取值)

                       IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联的值

                       IPC_SET:在进程有足够权限的前提下,把共享内存的当前关联值设置为shmid_ds结构中给出的值。

                       IPC_RMID:删除共享内存段。

                 3)buf:指向一个保存着共享内存的模式状态和访问权限的数据结构

struct shmid_ds
{
    uid_t shm_perm.uid;
    uid_t shm_perm.gid;
    mode_t shm_perm.mode;
}

返回值:成功返回0;失败返回-1


总结:

共享内存:

优点:无须复制,快捷,信息量大;

缺点:

1)通信是通过将共无法实现享空间缓冲区直接附加到进程的虚拟地址空间中来实现的,因此进程间的读写操作的同步问题;

2)利用内存缓冲区直接交换信息,内存的实体存在于计算机中,只能同一个计算机系统中的诸多进程共享,不方便网络通信