zoukankan      html  css  js  c++  java
  • System V IPC相关函数

    System V IPC

    将一个已保存的路径名和一个整数标识符转换成一个key_t值,称为IPC键
    key_t:System V IPC(System V消息队列、System V信号量、System V共享内存区)将key_t作为
    它们的名字

    #include <sys/ipc.h>
    
    key_t ftok(const char *pathname, int id);

    ipc_perm结构:

    内核给每个IPC对象维护一个信息结构

    #include <sys/ipc.h>
    
    struct ipc_perm{
        uid_t uid;    // 属主ID
        gid_t gid;    // 属组ID
        uid_t cuid;   // 创建者ID
        gid_t cgid;   // 创建者组ID
        mode_t mode;  // 读写权限
        ulong_t seq;  // 序列号
        key_t key;    // IPC键
    };
    // ipc_perm中的可以值可以是ftok()函数的返回值,也可以是IPC_PRIVATE(创建一个唯一的IPC对象)

    System V消息队列:

    内核为每个消息队列维护的信息结构:

    #include <sys/msg.h>
    
    struct msqid_ds{
        struct ipc_perm msg_perm;   // 内核给每个IPC对象维护的一个信息结构
        struct msg      *msg_first; // 指向队列中的第一个消息的指针
        struct msg      *msg_last;  // 指向队列中最后一个消息的指针
        msglen_t        msg_cbytes; // 此时的队列长度
        msgqnum_t       msg_qnum;   // 此时队列中消息的数量
        msglen_t        msg_qbytes; // 队列允许的最大长度
        pid_t           msg_lspid;  // 最近调用msgsnd()的PID  
        pid_t            msg_lrpid;  // 最近调用msgrcv()的PID  
        time_t            msg_stime;  // 最近调用msgsnd()的时间
        time_t             msg_rtime;  // 最近调用msgrcv()的时间
        time_t             msg_ctime;  // 最近调用msgctl()的时间
    };

    msgget()函数:

    #include <sys/msg.h>
    
    // 创建一个消息队列或访问一个已存在的消息队列
    // 成功返回非负标识符,出错返回-1
    int msgget(key_t key, int oflag);

    msgsnd()函数:

    #include <sys/msg.h>
    
    // 向标识符为msqid的消息队列放置一个消息
    // 成功返回0,失败返回-1
    int msgsnd(int msqid, const void *ptr, size_t length, int flag);
    // flag可以为0,也可以为IPC_NOWAIT(非阻塞模式)
    // length是以字节为单位指定待发送消息的长度,mtext的长度(sizeof(struct msgbuf) - sizeof(long))
    // ptr是一个结构指针,下面是此结构的模板,此结构可以自行定义
    struct msgbuf{
        long mtype;    // 消息类型
        char mtext[1]; // 消息数据
    };

    msgrcv()函数:

    #include <sys/msg.h>
    
    // 从标识符为msqid的消息队列读取一个消息
    // 成功返回读入数据字节数,出错返回-1
    ssize_t msgrcv(int msqid, void *ptr, size_t length, long type, int flag);
    // ptr结构指针,length为返回的最大数据量
    // type=0(返回消息队列的第一个消息) 
    // type>0(返回类型值为type的第一个消息) 
    // type<0(返回类型值小于或等于type绝对值的消息中类型值最小的第一个消息)

    msgctl()函数:

    #include <sys/msg.h>
    
    // 在一个消息队列上的各种控制操作
    // 成功返回0,出错返回-1
    int msgctl(int msqid, int cmd, struct msqid_ds *buff);
    // cmd = IPC_RMID 从系统中删除由msqid指定的消息队列
    // cmd = IPC_SET 为指定消息队列设置msqid_ds结构下的msg_perm.uid、msg_perm.gid、msg_perm.mode、msg_perm.qbytes
  • 相关阅读:
    Java使用Apache Commons Exec运行本地命令行命令
    Win10安装PostgreSQL9.6
    软件工程学习笔记——软件工具
    软件工程学习笔记——软件过程模型
    软件工程学习笔记——软件过程
    软件工程学习笔记——软件生存周期
    软件工程学习笔记——软件工程基本原理
    MySQL学习笔记——MySQL5.7的启动过程(一)
    Windows下免费的屏幕录制软件——EV录屏——推荐
    SecureCRT 8.1破解方式
  • 原文地址:https://www.cnblogs.com/lnlin/p/9697254.html
Copyright © 2011-2022 走看看