← 返回首页
Linux高级程序设计(五十九)
发表时间:2021-12-13 11:15:56
消息队列

消息队列是消息的链表,存放在内存中,由内核维护。

1.消息队列的特点

System V 提供的进程间通信机制需要一个 key 值,通过 key 值就可在系统内获得一个唯一的消息队列标识符。key 值可以是人为指定的,也可以通过 ftok() 函数获得。如果多个进程想通过IPC对象通信,则必须找到唯一的标识符,而唯一的标识符由key决定,所以只有获得了 key值就可以实现多个进程通信。

消息队列操作中的键(key)值相当于地址,消息队列标示符相当于具体的某个银行,消息类型相当于保险柜号码。同一个键(key)值可以保证是同一个消息队列,同一个消息队列标示符才能保证不同的进程可以相互通信,同一个消息类型才能保证某个进程取出是对方的信息。

为了避免出现key值冲突,通常使用ftok函数生成key。

2.ftok函数

函数原型:

#include <sys/types.h>
#include <sys/ipc.h>

key_t ftok(const char *pathname, int proj_id);

功能: 获取键(key)值

参数: pathname: 路径名 proj_id: 项目ID,非 0 整数(只有低 8 位有效),范围是0-127

返回值: 成功:key 值 失败:-1

实例:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/errno.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <string.h>

int main(int argc, char *argv[])
{
    key_t key;
    //只要path和proj_id不变,那么得到的key也不会发生改变,一定是唯一的。
    // "."表示当前目录
    if((key=ftok(".",100))==-1){
        perror("error to ftok key;");
        exit(1);
    }

    printf("key=%#x\n",key);

    return 0;
}

运行结果:

[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./a.out
key=0x64010131