链接: linux C学习目录

原文链接:https://blog.csdn.net/u013485792/article/details/50764224

关于ftok函数,先不去了解它的作用来先说说为什么要用它,共享内存,消息队列,信号量它们三个都是找一个中间介质,来进行通信的,这种介质多的是。就是怎么区分出来,就像唯一一个身份证来区分人一样。你随便来一个就行,就是因为这。只要唯一就行,就想起来了文件的设备编号和节点,它是唯一的,但是直接用它来作识别好像不太好,不过可以用它来产生一个号。ftok()就出场了。ftok函数具体形式如下:

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

其中参数fname是指定的文件名,这个文件必须是存在的而且可以访问的。id是子序号,它是一个8bit的整数。即范围是0~255。当函数执行成功,则会返回key_t键值,否则返回-1。在一般的UNIX中,通常是将文件的索引节点取出,然后在前面加上子序号就得到key_t的值。

有关该函数的三个常见问题:

  1. pathname是目录还是文件的具体路径,是否可以随便设置
  2. pathname指定的目录或文件的权限是否有要求
  3. proj_id是否可以随便设定,有什么限制条件

解答:

  1. ftok根据路径名,提取文件信息,再根据这些文件信息及project ID合成key,该路径可以随便设置。
  2. 该路径是必须存在的,ftok只是根据文件inode在系统内的唯一性来取一个数值,和文件的权限无关。
  3. proj_id是可以根据自己的约定,随意设置。这个数字,有的称之为project ID; 在UNIX系统上,它的取值是1到255;

简单验证:

用到的代码,文件wxyuan.c:

#include <stdio.h>
#include <sys/sem.h>
#include <stdlib.h>
int main()
{  key_t semkey;  if((semkey = ftok("./test", 1))<0)  {  printf("ftok failed\n");  exit(EXIT_FAILURE);  }     printf("ftok ok ,semkey = %d\n", semkey);  return 0;
}

关于ftok()函数的一个陷阱

在使用ftok()函数时,里面有两个参数,即fname和id,fname为指定的文件名,而id为子序列号,这个函数的返回值就是key,它与指定的文件的索引节点号和子序列号id有关,这样就会给我们一个误解,即只要文件的路径,名称和子序列号不变,那么得到的key值永远就不会变。

事实上,这种认识是错误的,想想一下,假如存在这样一种情况:在访问同一共享内存的多个进程先后调用ftok()时间段中,如果fname指向的文件或者目录被删除而且又重新创建,那么文件系统会赋予这个同名文件新的i节点信息,于是这些进程调用的ftok()都能正常返回,但键值key却不一定相同了。由此可能造成的后果是,原本这些进程意图访问一个相同的共享内存对象,然而由于它们各自得到的键值不同,实际上进程指向的共享内存不再一致;如果这些共享内存都得到创建,则在整个应用运行的过程中表面上不会报出任何错误,然而通过一个共享内存对象进行数据传输的目 的将无法实现。这是一个很重要的问题,希望能谨记!!!

所以要确保key值不变,要么确保ftok()的文件不被删除,要么不用ftok(),指定一个固定的key值。

Ubuntu下,ftok()产生键值的原理:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>int main()
{char    filename[50];struct stat     buf;int     ret;strcpy( filename, "/home/satellite/" );ret = stat( filename, &buf );if( ret ){printf( "stat error\n" );return -1;}printf( "the file info: ftok( filename, 0x27 ) = %x, st_ino = %x, st_dev= %x\n", ftok( filename, 0x27 ), buf.st_ino, buf.st_dev );return 0;
}

执行该源码:
satellite@ubuntu:~/test$ ./wxyuan
the file info: ftok( filename, 0x27 ) = 27012eef, st_ino = e2eef, st_dev= 801

通过执行结果可看出,ftok获取的键值是由ftok()函数的第二个参数的后8个bit,st_dev的后两位,st_ino的后四位构成的。

有关 st_dev和 st_ino的定义如下:
函数:int stat( const char *file_name, struct stat *buf )
函数说明:通过文件名filename,获取文件信息,并保存在buf所指的结构体stat中。
返回值:成功执行返回0,失败返回-1,错误代码存于errno
struct stat结构体的定义如下:

/usr/include/asm/stat.h
struct stat {unsigned long  st_dev;//文件的设备编号unsigned long  st_ino;//节点unsigned short st_mode; //文件的类型和存取的权限unsigned short st_nlink;//连到该文件的硬连接数目,刚建立的文件值为1unsigned short st_uid; //用户IDunsigned short st_gid; //组IDunsigned long st_rdev; unsigned long  st_size;unsigned long st_blksize;unsigned long  st_blocks;unsigned long  st_atime;unsigned long st_atime_nsec;unsigned long  st_mtime;unsigned long st_mtime_nsec;unsigned long  st_ctime;unsigned long st_ctime_nsec;unsigned long  __unused4;unsigned long  __unused5;

笔记

对于ftok()的函数第一个参数pathname到底是路径还是文件呢?
查看了好几个文档都说的模模糊糊的,只有自己试试了

key_t key = ftok(“.”,100);//使用本地路径

key_t key = ftok(“./1”,100);//使用文件

发现这二个方法都可以,实验说明路径和文件都可以使用!!!

linux C -- ftok函数相关推荐

  1. Linux中ftok函数介绍

    函数原型: *key_t ftok(const char fname, int id); 功能:系统建立IPC通讯(如消息队列,共享内存时)必须指定一个ID值.通常情况下,该id值通过ftok函数得到 ...

  2. Linux中ftok函数详解

    在ipc通信中 system V 模式的ipc通信中都需要一个key值来生成对应的ID,那么key是如何生成的呢? 通过函数ftok生成 #include <sys/types.h>#in ...

  3. linux中ftok的作用,Unix/Linux编程之ftok函数用法

    linux 中ftok函数的用法 1.函数作用: 系统建立IPC通讯(如消息队列.共享内存时)必须指定一个ID值.通常情况下,该id值通过ftok函数得到 2.函数原型: #include #incl ...

  4. ftok file php,Linux和PHP中的ftok函数返回值不一致问题跟踪

    在IPC中中,我们经常事情ftok函数来获取key,来作为获取消息队列id.共享存储标识和信号量ID.在项目中使用了php进程和linux进程通信,采用了消息队列的方式,但是结果表现为php中的fto ...

  5. Linux下的ftok()函数

    linux ftok()函数 - 清清飞扬 - 博客园 (cnblogs.com) 系统建立IPC通讯(如消息队列.共享内存时)必须指定一个ID值.通常情况下,该id值通过ftok函数得到. ftok ...

  6. linux 共享内存函数封装,linux ftok()函数 --多进程IPC之共享内存

    系统创建IPC通信(如消息队列.共享内存时)必须指定一个ID值.一般状况下,该id值经过ftok函数获得. ftok原型以下: key_t ftok( char * fname, int id ) f ...

  7. linux环境编程-- ftok()函数

    系统建立IPC通讯(如消息队列.共享内存时)必须指定一个ID值.通常情况下,该id值通过ftok函数得到. ftok原型如下: key_t ftok( char * fname, int id ) f ...

  8. linux ftok函数

    系统建立IPC通讯(如消息队列.共享内存时)必须指定一个ID值.通常情况下,该id值通过ftok函数得到. ftok原型如下: key_t ftok( char * fname, int id ) f ...

  9. linux ftok函数的使用

    ftok API #include <sys/types.h> #include <sys/ipc.h> key_t ftok(const char *pathname, in ...

最新文章

  1. 调整Kali Linux的锁屏时间
  2. 文件传输-对数据进行加解密的方法!
  3. Java 使用Commons-fileupload组件实现上传
  4. 资源 | 没有数学和编程基础,这几个数据科学项目了解一下
  5. 面向对象8:继承性、Object类的理解、写项目经验、debug经验
  6. 原生ajax调用,JavaScript进阶之原生AJAX接口请求的方式
  7. 构建多基因的系统发育树
  8. 当我在做技术管理时,我在做什么?
  9. TencentOS学习笔记(1)
  10. Linux 高性能计算集群(六)BeoWulf
  11. pygame小项目 ~ 3 :Python完成简易飞机大战
  12. vue3.0实现标签云(或词云)
  13. Unicode以及字符集转换
  14. 有转正机会!阿里达摩院多模态理解组招收研究型实习生
  15. 算法第四版课后习题答案 西安电子科技大学 计算机学院 算法课
  16. DIY一个按键精灵,用python控制mac的鼠标与键盘
  17. 发那科2021参数_FANUC 有关参数的方面的资料
  18. notes邮件正文显示不全_notes常见问题解决
  19. Windows Phone笔记(手机应用开发笔记)
  20. PTA 天梯赛 7-41 PAT排名汇总 (25 point(s))

热门文章

  1. HDCTF-2nd复盘
  2. 【渝粤题库】广东开放大学 建筑测量 形成性考核
  3. js中substring()、substr() 、slice()的用法
  4. python floor() 函数
  5. git clone速度太慢的解决办法
  6. C# 移除富文本多余标签
  7. 一般各类模具开模周期
  8. ildasm Reflector
  9. Linux Socket 两个客户端通信,服务端作为中转
  10. IntelliJ IDEA如何导出和导入项目