• dushu.tw 读书网、小说免费阅读网站

Linux IPC入门基础知识

简介

IPC 主要有消息队列、信号量和共享内存3种机制。和文件一样,IPC 在使用前必须先创建,使用 ipcs 命令可以查看当前系统正在使用的 IPC 工具:
Linux IPC入门基础知识
由以上可以看出,一个 IPC 至少包含 key值、ID值、拥有者、权限和使用的大小关键信息。如果需要手工删除某个 IPC 机制,可以使用 ipcrm 命令

key 值和 ID

IPC 在实现时编写使用 key 值作为参数创建,如果在创建时使用相同的 key 值将得到同一个 IPC 对象的 ID,这样就保证了双方可以获取用于传递数据的 IPC 机制 ID 值。key 值为一个32位的整型数据。Linux 提供函数 ftok() 来创建 key 值。

#include <sys/types.h>  #include <sys/ipc.h>    /* pathname 为文件路径名,第2个参数为 int 型变量 */  key_t ftok(const char *pathname, int proj_id);

每个文件都有其自身的属性,可以通过 stat() 函数读取,在 ftok() 函数创建 key 值过程中使用了该文件属性的 st_dev 和 st_ino 。具体构成如下:
Linux IPC入门基础知识

如果使用 ftok() 函数的参数是相同的,那么得到的 key 值是唯一的。所以说两个进程使用相同的参数创建同类 IPC 的话,就可以实现进程间的通信。

用以下程序来演示 key 值各位的组成:

#include <stdio.h>  #include <stdlib.h>  #include <sys/types.h>  #include <sys/ipc.h>  #include <sys/stat.h>  #include <unistd.h>    int main(int argc, char **argv)  {      int arg, key;      struct stat buf;        arg = atoi(argv[2]);        key = ftok(argv[1], arg);        printf("Key : %x nn", key);        stat(argv[1], &buf);        printf("argv[2] low 8  bits : %x n", arg & 0x0ff);      printf("st_dev  low 8  bits : %x n", buf.st_dev & 0x0ff);      printf("st_ino  low 16 bits : %x n", buf.st_ino & 0x0ffff);        return 0;  }

运行结果如下:
Linux IPC入门基础知识

拥有者及权限

要访问任何一个 IPC 工具需要对该 IPC 工具拥有相应的权限,一个 IPC 工具所具有的 IPC 访问权限定义为 struct ipc_perm。其成员定义如下:
Linux IPC入门基础知识

补充 stat 结构体:

struct stat {            mode_t      st_mode;            // 文件对应的模式,文件,目录            ino_t       st_ino;             // inode 节点号            dev_t       st_dev;             // 设备号码            dev_t       st_rdev;            // 特殊设备号码            nlink_t     st_nlink;           // 文件的连接数            uid_t       st_uid;             // 文件所有者            gid_t       st_gid;             // 文件所有者对应的组            off_t       st_size;            // 普通文件,对应的文件字节数            time_t      st_atime;           // 文件最后被访问的时间            time_t      st_mtime;           // 文件内容最后被修改的时间            time_t      st_ctime;           // 文件状态改变时间            blksize_t       st_blksize;     // 文件内容对应的块大小            blkcnt_t        st_blocks;      // 文件内容对应的块数量  };

本文永久更新链接地址:http://www.linuxidc.com/Linux/2018-02/150771.htm

Linux IPC入门基础知识


举个栗子 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Linux IPC入门基础知识
喜欢 (0)
关于作者:
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到