消息队列及信号灯集的相关函数

一、信号灯集:
    由一个或者多个信号灯组成,每个信号灯都是一个计数器,由内核维护。
相关函数:
    1、信号灯集的创建
        函数原型:
            int semget(key_t key, int nsems, int semflag);
        头文件:
        #include
        #include
        #include
    参数:
        key: 可以是 IPC_PRIVATE, 也可以是ftok返回值。
        nsems: 创建等集中信号灯的个数
        semflag: IPC_CREAT | 0640(访问权限)
    返回值:
        成功: 信号灯集的id号
        失败: -1;
        
    2、信号灯的操作函数
        函数原型:
            int semop(int semid, struct sembuf *sem, size_t n);
        参数:
            semid: 信号灯集的id号
            sem: 结构体指针
                struct sembuf{
                    short sem_num;//带操作的信号灯的编号
                    short sem_op;//信号灯的操作方式(
                                        0:等待
                                        -1:p操作,申请资源
                                        1;v操作,释放资源)
                    short sem_flag;   //0:阻塞等待    IPC_NOWAIT: 非阻塞
                };
            n: 要操作的信号灯个数
        返回值:
            成功: 0
            失败: -1
            
    3、信号灯集的控制函数
    函数原型:
        int semctl (int semid, int semnum, int cmd…/*union semun arg*/)
    参数:
        semid:信号灯集 id号
            semnum:要修改的信号灯的编号
            cmd:
                SETVAL:设置信号灯的值
                GETVAL:获取信号灯的值
                IPC_RMID:删除信号灯
        返回值:
            成功:0
            失败:-1
        注意:
            该函数可以有3 个或4 个参数。
            当 cmd 使用 SETVAL或GETVAL时,必须使用第4参数,第4参数必须是一下的union类型
            union semun {
               int              val;    /* Value for SETVAL */
               struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
               unsigned short  *array;  /* Array for GETALL, SETALL */
               struct seminfo  *__buf;  /* Buffer for IPC_INFO (Linux-specific) */
           };
           
二、消息队列
    相关接口函数:
        1、打开或者创建消息队列
            int msgget(key_t key, int flag);
            头文件:    
                #include
                #include
                #include
            参数:
                key: IPC_PRIVATE 或者是 ftok函数的返回值
                flag: 消息队列访问权限(IPC_CREAT | 0664)
            返回值:
                成功:消息队列id号
                失败:-1
        
        2、发送消息(添加消息)
            int magsnd(int msgid, const void *msgbuf, size_t size, int flag);
            参数:
                msgid: 消息队列id号
                msgbuf: 消息的缓存区首地址,消息类型必须如下所示:
                    struct msgbuf{
                        long type;//消息类型
                        char buf[32];
                        .......//消息正文
                    };
                size: 消息正文长度
                flag:
                    0:阻塞等待发送消息完成
                    IPC_NOWAIE: 非阻塞
            返回值:
                成功: 0
                失败: -1

        3、接收消息(速去消息)
            int msgrcv(int msgid, void *msgbuf, size_t size, long msgtype, int flag);
            参数:
                msgid:   消息队列id号
                msgbuf:  存储消息的缓冲区
                size:    消息正文的长度
                msgtype: 要读取消息的类型 
                flag:
                    0:若无数据,一直阻塞下去
                    IPC_NOWAIT: 非阻塞
            返回值:    
                成功:实际读取的字节数
                失败:-1
        4、消息队列的控制
            int msgctl(int msgid, int cmd, struct maqid_ds *buf);
            参数:
                msgid: 消息队列的id号
                cmd:
                    IPC_STAT: 读取消息队列的属性, 并将其保存在buf指向的缓存区中。
                    IPC_SET: 设置消息队列的属性,这个值取自buf参数。
                    IPC_RMID: 从系统中删除消息队列。
                buf: 消息队列缓存区
            返回值:
                成功: 0
                失败: -1

你可能感兴趣的:(c#)