前言:
在UNIX和Linux系统中,共享内存是一种进程间通信的机制,它允许两个或更多的进程访问同一段内存。因为数据不需要在客户机和服务器之间复制,所以这是最快的一种IPC。下面是一些与共享内存相关的系统调用函数及其头文件:
1.头文件
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
2.各个函数
2.1:**key_t ftok(const char *pathname, int proj_id);**作用是根据文件名和第二个参数工程序号进行组合,申请一个键值key_t,它能保证不同的进程在创建ipc对象时得到互不干扰的键值。
2.2:int shmget(key_t key, size_t size, int shmflg); key值只是唯一标识这个共享内存,size是这个共享内存最小的空间,如果创建新的共享内存段,则必须指定其size,反之,可以指定为0。 shmflg参数有IPC_CREATE和IPC_EXCL,IPC_STAT
IPC_CREAT:如果 key 不存在,那么创建一个新的共享内存段。
IPC_EXCL:如果 key 不存在,且创建了一个新的共享内存段,那么返回 -1 并设置 errno 为 EEXIST。这个标志和 IPC_CREAT 一起使用时,可以用于测试并创建一个新的共享内存段。
IPC_STAT:获取共享内存的状态信息,并将其存储在 shmid_ds 结构中。
这些标志位的组合和用途可以根据具体的需求进行调整。例如,如果你只是想获取一个已经存在的共享内存段,那么你可以使用 IPC_STAT 标志。如果你想创建一个新的共享内存段,那么你可以使用 IPC_CREAT 标志。如果你想测试并创建一个新的共享内存段(如果已经存在,则不创建),那么你可以使用 IPC_EXCL 和 IPC_CREAT 标志。
2.3:**void *shmat(int shmid, const void *shmaddr, int shmflg);**将一个共享内存段附加到调用进程的地址空间。shmid是共享内存段的标识符,由shmget返回。shmaddr是附加点,如果为NULL,则内核会选择一个地址。shmflg是用于指定附加行为的标志。
2.4:**int shmdt(const void *shmaddr);**从调用进程的地址空间中分离一个共享内存段。shmaddr是之前由shmat返回的地址。
2.5:**int shmctl(int shmid, int cmd, struct shmid_ds *buf);**控制共享内存段的行为。shmid是共享内存段的标识符,由shmget返回。cmd是要执行的操作,如删除、销毁等。shmbuf是一个包含共享内存段信息的结构。
3.总结
shmget(key, size, shmflg):创建或获取一个共享内存段。key是一个非负整数,如果为负,那么它会被当作是0,如果为正,那么会尝试在系统中搜索具有相同键的共享内存段。size是请求的共享内存的大小。shmflg是用于指定共享内存段属性的标志。
shmat(shmid, shmaddr, shmflg):将一个共享内存段附加到调用进程的地址空间。shmid是共享内存段的标识符,由shmget返回。shmaddr是附加点,如果为NULL,则内核会选择一个地址。shmflg是用于指定附加行为的标志。
shmdt(shmaddr):从调用进程的地址空间中分离一个共享内存段。shmaddr是之前由shmat返回的地址。
shmctl(shmid, cmd, shmbuf):控制共享内存段的行为。shmid是共享内存段的标识符,由shmget返回。cmd是要执行的操作,如删除、销毁等。shmbuf是一个包含共享内存段信息的结构。
请注意,上述函数都可能会失败并返回-1,需要使用errno来检查失败的原因。同时,对共享内存的操作需要小心处理,因为不当的错误处理可能导致程序崩溃或其他问题。