《Unix网络编程》卷2 读书笔记 第3章- System V IPC

时间:2022-06-23 19:26:54

1. 概述

  • 三种类型的System V IPC:System V 消息队列、System V 信号量、System V 共享内存区
  • System V IPC在访问它们的函数和内核为它们维护的信息上共享许多类似点。本章讲述所有这些共同属性。
  • 下图汇总了所有System V IPC 函数
    《Unix网络编程》卷2 读书笔记 第3章- 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. 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对象

《Unix网络编程》卷2 读书笔记 第3章- System V IPC

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

《Unix网络编程》卷2 读书笔记 第3章- System V IPC
   《Unix网络编程》卷2 读书笔记 第3章- System V 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改变
      《Unix网络编程》卷2 读书笔记 第3章- System V IPC
    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函数)执行一次,以后每次使用该对象时执行一次
    《Unix网络编程》卷2 读书笔记 第3章- System V IPC

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

《Unix网络编程》卷2 读书笔记 第3章- System V IPC的更多相关文章

  1. &lbrack;转载&rsqb; 读《UNIX网络编程 卷1:套接字联网API》

    原文: http://cstdlib.com/tech/2014/10/09/read-unix-network-programming-1/ 文章写的很清楚, 适合初学者 最近看了<UNIX网 ...

  2. 《Linux&sol;Unix系统编程手册》读书笔记 目录

    <Linux/Unix系统编程手册>读书笔记1  (创建于4月3日,最后更新4月7日) <Linux/Unix系统编程手册>读书笔记2  (创建于4月9日,最后更新4月10日) ...

  3. 《Linux&sol;Unix系统编程手册》读书笔记9(文件属性)

    <Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...

  4. 《Linux&sol;Unix系统编程手册》读书笔记8 (文件I&sol;O缓冲)

    <Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...

  5. 《Linux&sol;Unix系统编程手册》读书笔记7 (&sol;proc文件的简介和运用)

    <Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...

  6. 《Linux&sol;Unix系统编程手册》读书笔记6

    <Linux/Unix系统编程手册>读书笔记 目录 第9章 这章主要讲了一堆关于进程的ID.实际用户(组)ID.有效用户(组)ID.保存设置用户(组)ID.文件系统用户(组)ID.和辅助组 ...

  7. 《Linux&sol;Unix系统编程手册》读书笔记5

    <Linux/Unix系统编程手册>读书笔记 目录 第8章 本章讲了用户和组,还有记录用户的密码文件/etc/passwd,shadow密码文件/etc/shadow还有组文件/etc/g ...

  8. 《Linux&sol;Unix系统编程手册》读书笔记4

    <Linux/Unix系统编程手册>读书笔记 目录 第7章: 内存分配 通过增加堆的大小分配内存,通过提升program break位置的高度来分配内存. 基本学过C语言的都用过mallo ...

  9. 《Linux&sol;Unix系统编程手册》读书笔记3

    <Linux/Unix系统编程手册>读书笔记 目录 第6章 这章讲进程.虚拟内存和环境变量等. 进程是一个可执行程序的实例.一个程序可以创建很多进程. 进程是由内核定义的抽象实体,内核为此 ...

随机推荐

  1. 关于Interception框架

    对于OOP来说,是个树形结构,如果要实现多个子数之间的共享服务,例如很多子树都用到日志服务,这时候AOP的横切关注 cross cutting concerns就非常有用了.如果要使每个类具备一项功能 ...

  2. Mysql导入导出非常慢解决办法

    MySQL导出的SQL语句在导入时有可能会非常非常慢,经历过导入仅45万条记录,竟用了近3个小时.在导出时合理使用几个参数,可以大大加快导入的速度. -e 使用包括几个VALUES列表的多行INSER ...

  3. paip&period;解决 数据库mysql增加列 字段很慢添加字段很慢

    paip.解决 数据库mysql增加列 字段很慢添加字段很慢 #环境如下: mysql5.6    数据仅仅3w alter table xxx add column yyy int default ...

  4. 安装完最小化 RHEL&sol;CentOS 7 后需要做的 30 件事情(六)码农网

    30. 用密码保护 GRUB 用密码保护你的 boot 引导程序这样你就可以在启动时获得额外的安全保障.同时你也可以在实物层面获得保护.通过在引导时给 GRUB 加锁防止任何无授权访问来保护你的服务器 ...

  5. Mac commands

    /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java uname -a 显示系统隐藏文件.在终端(Ter ...

  6. Disable keyboard input on Android TimePicker

    try to use: myTimePicker.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS); to disable f ...

  7. JS和利用openssl的object C加密得到相同的aes加密密文

    这是之前接到的一个工作内容,项目原本的登录操作是获得账号和密码以后,对密码进行一遍MD5加密,然后传递账号和密文到cgi文件.在c中获取到账户以后,从数据库中获取到密码,对密码进行一次MD5的加密,然 ...

  8. InsertSort 插入排序

    插入排序:将下一个插入已排好的序列中 自己觉得演示的号的一个文章地址 http://sjjg.js.zwu.edu.cn/SFXX/sf1/zjcr.html 下面是java的实现代码: //Inse ...

  9. NHibernate变的简单

    前言 这篇文章出自于我尝试学习使用Nhiberbnate的挫败感.我发现好像Nhibernate全部的介绍材料不是很模糊就是太详细.我所需要的就是一个简单直接的教程,能让我尽快对NHibernate熟 ...

  10. Java提供的enum详解

    今天第一天看<<Effective Java>>,看了第六章的第一条就是全书的第30条--用enum代替int常量. 1.第一次知道原来enum也可以像class那样拥有成员函 ...