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

  • 相关阅读:
    动手学深度学习(Pytorch版)代码实践 -计算机视觉-38实战Kaggle比赛:图像分类 (CIFAR-10)
    【课外阅读】cpp并发编程实战
    21条最好实践,从实际全面保障 GitHub 使用安全,你必须要知道的哦
    [统计机器学习]SVM
    竞赛选题 基于机器视觉的停车位识别检测
    大一新生HTML期末作业,网页制作作业——海鲜餐饮网站登录页面(单页面)HTML+CSS+JavaScript
    Spring Cloud框架学习-Spring Cloud Sleuth
    Error: spawn webpack-dev-server EACCES
    Mysql数据类型
    【java web】自己捣鼓的班级随机点名(html+servlet)
  • 原文地址:https://blog.csdn.net/slgcsdn/article/details/132702364