博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Unix网络编程》卷2 读书笔记 第3章- System V IPC
阅读量:6891 次
发布时间:2019-06-27

本文共 1820 字,大约阅读时间需要 6 分钟。

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命令

转载于:https://www.cnblogs.com/DayByDay/p/3948432.html

你可能感兴趣的文章
c++获取进程的运行路径
查看>>
oracle 日常操作
查看>>
我的友情链接
查看>>
高级I/O---多路复用---poll
查看>>
计算机集群多任务投递脚本
查看>>
Flume数据采集之常见集群配置案例
查看>>
自定义ANDROID中EDITTEXT中的HINT文本的大小
查看>>
Unity3D下用C#通过WinSCP命令行方式给Linux服务器SCP传文件
查看>>
Fedora遇难记之rpmfusion:获取 GPG 密钥失败
查看>>
Exception
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
VC改变鼠标的WM_SETCURSOR( setcursor() )
查看>>
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
查看>>
Leetcode PHP题解--D82 13. Roman to Integer
查看>>
使用scrapy抓取股票代码
查看>>
hashmap实现原理浅析
查看>>
1.1什么是数据仓库
查看>>
注册个博客好累哦
查看>>
spring mvc 如何从前台表单传递集合参数并绑定集合对象
查看>>