linux应用编程:key_t与ftok函数

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

//函数ftok把一个已存在的路径名和一个整数标识符转换成一个key_t值,称为IPC健
//该函数把从 pathname导出的信息与id的低序8位组合成一个整数IPC键
key_t ftok(const char *pathname, int proj_id);

  • System V IPC的某个给定应用来说,客户和服务器同意使用对该应用有一定意义的 pathname。它可以是服务器守护程序的路径名、服务器使用的某个公共数据文件的路径名或者系统上的某个其他路径名。如果客户和服务器之间只需单个IPC通道,那么可以使用譬如说值为1的id。如果需要多个IPC通道,譬如说从客户到服务器一个通道,从服务器到客户又ー个通道,那么作为一个例子,一个通道可使用值为1的id,另一个通道可使用值为2的id,客户和服务器一旦在 pathname和id上达成一致,双方就都能调用fok函数把 pathname和id转换成同一个IPC键值 。

  • ftok的典型实现调用stat函数,然后组合以下三个值:
    (1) pathname所在的文件系统的信息(stat结构的st_dev成员)。
    (2)该文件在本文件系统内的索引节点号(stat结构的st_ino成员)。
    (3)id的低序8位(不能为0)。

  • 注意:如果 pathname不存在,或者对于调用进程不可访问,ftok就返回-1。

  • 注意:路径名用于产生键的文件不能是在服务器存活期间由服务器反复创建并删除的文件,因为该文件每次创建时由系统赋予的索引节点号很可能不一样,于是对下一个调用者来说,由ftok返回的键也可能不同。

示例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    struct  stat stat1;

    if (argc != 2)  {
        printf("err: argc\n");
        exit(1);
    }

    stat(argv[1], &stat1);
    key_t key = ftok(argv[1], 0x12);
    if (-1 == key) {
        printf("key err \n");
        exit(1);
    }

    printf("st_dev:%lx  st_ino:%lx   key:%x\n", stat1.st_dev, stat1.st_ino, key);
    
    exit(0);
}

在这里插入图片描述

  • 从结果可以看出,id占key的高8位,st_dev的低8位占key的中间8位,st_ino的低16位占key的低16位
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]中提到,ftok函数的功能是通过文件信息和计划编号合成一个IPC key键值。该函数的返回值是一个key_t类型的值,即IPC键值。参数pathname是指定的文件路径,该文件必须存在且可存取。参数proj_id是计划代号,用于让一个文件能够生成多个IPC key键值。ftok函数利用同一文件最多可得到256个IPC key键值,因为它只取proj_id值二进制的后8位,即16进制的后两位与文件信息合成IPC key键值。 引用\[2\]中给出了ftok函数的声明,它包含在sys/ipc.h头文件中。 引用\[3\]中解释了通常使用ftok函数将一个已存在的路径名和一个整数标识符转换成一个IPC键。这个键可以通过ftok函数生成,也可以直接指定一个整数。需要注意的是,键的正负问题也需要考虑。 综上所述,key_t ftok函数的作用是通过文件信息和计划编号生成一个IPC键值。 #### 引用[.reference_title] - *1* [key_t键和ftok函数](https://blog.csdn.net/weixin_36750623/article/details/83044571)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【IPC通信】key_t键和ftok函数](https://blog.csdn.net/oNelson123/article/details/109660680)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值