一.共享内存
共享内存:允许两个不相关的进程访问同一个逻辑内存。为两个正在运行的进程之间共享和传递数据不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,是异步通信,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。
int shm_open(const char *name, int oflag, mode_t mode);
int shm_unlink(const char *name);
int ftruncate(int fd, off_t length);
1.munmap()/msync()回写时机,与实际结果不一致。
2.同一个程序多次映射文件,文件内容的长度与映射内容长度不一至,并且比较随机
.System V共享内存
1.int shmget(key_t key, size_t size, int shmflg); 创建/打开共享内存
key:关键字, 与内核现有的其他共享内存的关键字相比较,在比较之后,打开和访问都依赖于shmflag参数的内容
IPC_EXCL与IPC_CREAT一起使用时,防止一个现有的内存被访问而被打开着。一旦进程获得了给定内存段的合法IPC标识符,接着连接该内存,为共享内存段命名,shmget函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1,不相关的进程可以通过该函数的返回值访问同一共享内存,它代表程序可能要使用的某个资源,程序对所有共享内存的访问都是间接的,程序先通过调用shmget函数并提供一个键,再由系统生成一个相应的共享内存标识符(shmget函数的返回值),只有shmget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。
size以字节为单位指定需要共享的内存容量;
shmflg是权限标志,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以与IPC_CREAT做或操作。
2.int shmctl(int shmid, int cmd, struct shmid_ds *buf);控制管理共享内存
shmid:是共享内存的句柄,是shmget函数返回的共享内存标识符。;
cmd:向共享内存发送的命令
buf:向共享内存发送命令的参数,是一个结构指针,它指向共享内存模式和访问权限的结构。
3.void *shmat(int shmid, const void *shmaddr, int shmflg);
连接(加载),获取共享内存的地址,获取成功后,可对其进行读写操作,当参数为0时,试着查找一个未映射的区域。
void *shmat(int shmid, const void *shmaddr, int shmflg);
断开,删除一段共享内存
shm_id是由shmget函数返回的共享内存标识。
shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。
shm_flg是一组标志位,通常为0。
调用成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1.
4.、shmdt函数
将共享内存从当前进程中分离。注意,将共享内存分离并不是删除它,只是使该共享内存对当前进程不再可用。
int shmdt(const void *shmaddr);
参数shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1.
二.信号量
信号量是一种计数器,用来控制对多个进程共享的资源所进行的访问。它们常常被用作一个锁机制,在某个进程正在对特定资源进行操作时,信号量可以防止另一个进程去访问它。
1.新建信号量函数semget():
int semget(key_t key, int nsems, int semflg);
key:fork生成的键值
nsems:指定在新的集合中应该创建的信号量的数目
semflag:打开信号量的方式
2.控制信号量参数semctl():
int semctl(int semid, int semnum, int cmd, ...);
semid:调用semget()所返回的值
semum:将要操作的信号量的编号,它是信号量集合的索引值