zoukankan      html  css  js  c++  java
  • Linux IPC基础(System V)

    简介

    IPC 主要有消息队列、信号量和共享内存3种机制。和文件一样,IPC 在使用前必须先创建,使用 ipcs 命令可以查看当前系统正在使用的 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 。具体构成如下:

    如果使用 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 
    
    ", key);
    
        stat(argv[1], &buf);
    
        printf("argv[2] low 8  bits : %x 
    ", arg & 0x0ff);
        printf("st_dev  low 8  bits : %x 
    ", buf.st_dev & 0x0ff);
        printf("st_ino  low 16 bits : %x 
    ", buf.st_ino & 0x0ffff);
    
        return 0;
    }
    

    运行结果如下:

    拥有者及权限

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

    补充 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;      // 文件内容对应的块数量
    };
    
  • 相关阅读:
    Setting up jQuery Unobtrusive Validation
    Valid vs Validate
    HTML Tags containing Vue.js v-if and v-for directives flash at loading
    What does a CSS selector in square brackets select in HTML?
    Template refs
    How to check if a variable is not null?
    Android中的Context
    Android从零基础到App上线
    ConstraintLayout 使用汇总
    ConstraintLayout的使用
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/8413809.html
Copyright © 2011-2022 走看看