• linux共享内存(ipc通信)


    前言:
    在UNIX和Linux系统中,共享内存是一种进程间通信的机制,它允许两个或更多的进程访问同一段内存。因为数据不需要在客户机和服务器之间复制,所以这是最快的一种IPC。下面是一些与共享内存相关的系统调用函数及其头文件:

    1.头文件
    #include
    #include
    #include

    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来检查失败的原因。同时,对共享内存的操作需要小心处理,因为不当的错误处理可能导致程序崩溃或其他问题。

  • 相关阅读:
    Snipaste--强大的截图贴图软件--非常实用
    学习总结week6_1excel入门
    Promise的九大方法(resolve、reject、then、catch、finally、all、allSettled、race、any)你都用过那些?
    Python基于OpenCV的异常行为检测系统[源码&部署教程]
    【Redux】异步action与同步action
    React源码学习(一):如何学习React源码
    Nginx反向代理、负载均衡理解及实践
    03.大型高并发微服务系统设计
    数字标牌/广告机无线组网方案
    R语言基于指定规则、条件删除列表中的元素:使用purrr包的discard函数移除列表数据中的NA值
  • 原文地址:https://blog.csdn.net/slgcsdn/article/details/132702364