zoukankan      html  css  js  c++  java
  • 《Unix网络编程》卷2 读书笔记 第3章- System V IPC

    1. 概述

    • 三种类型的System V IPC:System V 消息队列、System V 信号量、System V 共享内存区
    • System V IPC在访问它们的函数和内核为它们维护的信息上共享许多类似点。本章讲述所有这些共同属性。
    • 下图汇总了所有System V IPC 函数

    2. key_t键、ftok函数

    • 头文件sys/types.h把数据类型key_t定义为一个整数,通常是一个至少32位的整数
    1. #include <sys/ipc.h>
    2. key_t ftok (const char *pathname, int id);
    3. Returns: IPC key if OK, -1 on error
    • 函数ftok把一个已经在的路径名和一个整数标识符转换成一个key_t值,称为IPC键
    • 如果pathname不存在,或者对于调用进程不可访问,ftok返回-1
    • 不能保证两个不同的路径名与同一个id的组合产生不同的键。

    3. ipc_perm结构

    • 内核给每个IPC对象维护一个信息结构,其内容跟内核给文件维护的信息类似
      1. struct ipcqerm {
      2. uid_t uid; /* owner's user id */
      3. gid_t gid; /* owner's group id */
      4. uid_t cuid; /* creator's user id */
      5. gid_t cgid; /* creator's group id */
      6. mode_t mode; /* read - write permissions */
      7. ulong_t seq; /* slot usage sequence number */
      8. key_t key; /* IPC key */
      9. };

    4. 创建与打开IPC通道

    • 对于key值,应用程序有两种选择
      1. 调用ftok,给它传递pathname和id
      2. 指定key为IPC_PRIVATE,这将保证会创建一个新的、唯一的IPC对象

      

    • 所有三个XXXget函数都有一个名为oflag的参数,它指定IPC对象的读写权限位(ipc_perm结构的mode成员),并选择是创建一个新的IPC对象,还是访问一个已存在的IPC对象。

      
      

    • System V IPC定义了自己的IPC_XXX常值,而并不像标准open函数以及Posix IPC函数那样使用O_CREAT和O_EXCL常值
    • 注意:System V IPC函数将它们的IPC_XXX常值根权限位合到单个oflag参数中。而open函数有一个名为oflag和mode的参数

    5. IPC 权限

    • 每当使用某个XXXget函数创建一个新的IPC对象时,以下信息就保存到该对象的ipc_perm结构中
      1. oflag参数中的某些位初始化ipc_perm结构的mode成员。SEM_A的后缀A代表alter改变
      2. ipc_perm结构中cuid和cgid成员分别设置为调用进程的有效用户ID和有效组ID,这两个成员合称为创建者ID
      3. ipc_perm结构中的uid和gid成员也分别设置为调用进程的有效用户ID和有效组ID,这两个成员合称为属主ID
    • 尽管一个进程可以通过调用XXXctl函数修改属主ID,但创建者ID却从不改变。XXXctl函数还允许一个进程修改某个IPC对象的mode成员
    • 每当一个进程访问某个IPC对象时,IPC就执行两级检查,该对象被打开时(XXXget函数)执行一次,以后每次使用该对象时执行一次

    6. 标识符重用

    • ipc_perm结构中含有一个seq的变量,它是一个槽位使用情况序列号。该变量是一个由内核为系统中每个潜在的IPC对象维护的计数器。每当删除一个IPC对象时,内核就递增相应的槽位号,若溢出则循环为0 。
    • 该计数器的存在有两个原因:
      1. 考虑由内核维护的用于打开文件的文件描述符。它们是些小整数,只在单个进程内有意义,是进程特定的值。然而,System V IPC标识符却是系统范围的,而不是特定于进程的
      2. 为了避免短时间内重用System V IPC标识符

    7. ipcs、ipcrm程序

    • 只能用于System V IPC,而不能用于Posix IPC
    • ipcs -q -m -s
    • ipcrm --all=msg

    8. 内核限制

    • sysctl命令
  • 相关阅读:
    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
    11
    实战 迁移学习 VGG19、ResNet50、InceptionV3 实践 猫狗大战 问题
    tx2系统备份与恢复
    如何在Ubuntu 18.04上安装和卸载TeamViewer
    bzoj 3732 Network (kruskal重构树)
    bzoj2152 聪聪可可 (树形dp)
    牛客 216D 消消乐 (二分图最小点覆盖)
    牛客 197E 01串
    Wannafly挑战赛23
  • 原文地址:https://www.cnblogs.com/DayByDay/p/3948432.html
Copyright © 2011-2022 走看看