小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

ftok()函數(shù)深度解析

 XeonGate 2019-10-21

    https://blog.csdn.net/u013485792/article/details/50764224

  關(guān)于ftok函數(shù),先不去了解它的作用來先說說為什么要用它,共享內(nèi)存,消息隊(duì)列,信號(hào)量它們?nèi)齻€(gè)都是找一個(gè)中間介質(zhì),來進(jìn)行通信的,這種介質(zhì)多的是。就是怎么區(qū)分出來,就像唯一一個(gè)身份證來區(qū)分人一樣。你隨便來一個(gè)就行,就是因?yàn)檫@。只要唯一就行,就想起來了文件的設(shè)備編號(hào)和節(jié)點(diǎn),它是唯一的,但是直接用它來作識(shí)別好像不太好,不過可以用它來產(chǎn)生一個(gè)號(hào)。ftok()就出場(chǎng)了。ftok函數(shù)具體形式如下:

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

    其中參數(shù)fname是指定的文件名,這個(gè)文件必須是存在的而且可以訪問的。id是子序號(hào),它是一個(gè)8bit的整數(shù)。即范圍是0~255。當(dāng)函數(shù)執(zhí)行成功,則會(huì)返回key_t鍵值,否則返回-1。在一般的UNIX中,通常是將文件的索引節(jié)點(diǎn)取出,然后在前面加上子序號(hào)就得到key_t的值。

有關(guān)該函數(shù)的三個(gè)常見問題:

1.pathname是目錄還是文件的具體路徑,是否可以隨便設(shè)置

2.pathname指定的目錄或文件的權(quán)限是否有要求

3.proj_id是否可以隨便設(shè)定,有什么限制條件

解答:

   1、ftok根據(jù)路徑名,提取文件信息,再根據(jù)這些文件信息及project ID合成key,該路徑可以隨便設(shè)置。

    2、該路徑是必須存在的,ftok只是根據(jù)文件inode在系統(tǒng)內(nèi)的唯一性來取一個(gè)數(shù)值,和文件的權(quán)限無關(guān)。

    3、proj_id是可以根據(jù)自己的約定,隨意設(shè)置。這個(gè)數(shù)字,有的稱之為project ID; 在UNIX系統(tǒng)上,它的取值是1到255;

簡單驗(yàn)證:

                   

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

  1. #include <stdio.h>
  2. #include <sys/sem.h>
  3. #include <stdlib.h>
  4. int main()
  5. {
  6. key_t semkey;
  7. if((semkey = ftok("./test", 1))<0)
  8. {
  9. printf("ftok failed\n");
  10. exit(EXIT_FAILURE);
  11. }
  12. printf("ftok ok ,semkey = %d\n", semkey);
  13. return 0;
  14. }

關(guān)于ftok()函數(shù)的一個(gè)陷阱

     在使用ftok()函數(shù)時(shí),里面有兩個(gè)參數(shù),即fname和id,fname為指定的文件名,而id為子序列號(hào),這個(gè)函數(shù)的返回值就是key,它與指定的文件的索引節(jié)點(diǎn)號(hào)和子序列號(hào)id有關(guān),這樣就會(huì)給我們一個(gè)誤解,即只要文件的路徑,名稱和子序列號(hào)不變,那么得到的key值永遠(yuǎn)就不會(huì)變。

     事實(shí)上,這種認(rèn)識(shí)是錯(cuò)誤的,想想一下,假如存在這樣一種情況:在訪問同一共享內(nèi)存的多個(gè)進(jìn)程先后調(diào)用ftok()時(shí)間段中,如果fname指向的文件或者目錄被刪除而且又重新創(chuàng)建,那么文件系統(tǒng)會(huì)賦予這個(gè)同名文件新的i節(jié)點(diǎn)信息,于是這些進(jìn)程調(diào)用的ftok()都能正常返回,但鍵值key卻不一定相同了。由此可能造成的后果是,原本這些進(jìn)程意圖訪問一個(gè)相同的共享內(nèi)存對(duì)象,然而由于它們各自得到的鍵值不同,實(shí)際上進(jìn)程指向的共享內(nèi)存不再一致;如果這些共享內(nèi)存都得到創(chuàng)建,則在整個(gè)應(yīng)用運(yùn)行的過程中表面上不會(huì)報(bào)出任何錯(cuò)誤,然而通過一個(gè)共享內(nèi)存對(duì)象進(jìn)行數(shù)據(jù)傳輸?shù)哪? 的將無法實(shí)現(xiàn)。

      這是一個(gè)很重要的問題,希望能謹(jǐn)記!??!

     所以要確保key值不變,要么確保ftok()的文件不被刪除,要么不用ftok(),指定一個(gè)固定的key值。

Ubuntu下,ftok()產(chǎn)生鍵值的原理:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/stat.h>
  4. int main()
  5. {
  6. char filename[50];
  7. struct stat buf;
  8. int ret;
  9. strcpy( filename, "/home/satellite/" );
  10. ret = stat( filename, &buf );
  11. if( ret )
  12. {
  13. printf( "stat error\n" );
  14. return -1;
  15. }
  16. printf( "the file info: ftok( filename, 0x27 ) = %x, st_ino = %x, st_dev= %x\n", ftok( filename, 0x27 ), buf.st_ino, buf.st_dev );
  17. return 0;
  18. }

執(zhí)行該源碼:

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


通過執(zhí)行結(jié)果可看出,ftok獲取的鍵值是由ftok()函數(shù)的第二個(gè)參數(shù)的后8個(gè)bit,st_dev的后兩位,st_ino的后四位構(gòu)成的。


有關(guān)st_dev和st_ino的定義如下:
  1. 函數(shù):int stat( const char *file_name, struct stat *buf )
  2. 函數(shù)說明:通過文件名filename,獲取文件信息,并保存在buf所指的結(jié)構(gòu)體stat中。
  3. 返回值:成功執(zhí)行返回0,失敗返回-1,錯(cuò)誤代碼存于errno
  4. struct stat結(jié)構(gòu)體的定義如下:
  5. /usr/include/asm/stat.h
  6. struct stat {
  7. unsigned long st_dev;//文件的設(shè)備編號(hào)
  8. unsigned long st_ino;//節(jié)點(diǎn)
  9. unsigned short st_mode; //文件的類型和存取的權(quán)限
  10. unsigned short st_nlink;//連到該文件的硬連接數(shù)目,剛建立的文件值為1
  11. unsigned short st_uid; //用戶ID
  12. unsigned short st_gid; //組ID
  13. unsigned long st_rdev;
  14. unsigned long st_size;
  15. unsigned long st_blksize;
  16. unsigned long st_blocks;
  17. unsigned long st_atime;
  18. unsigned long st_atime_nsec;
  19. unsigned long st_mtime;
  20. unsigned long st_mtime_nsec;
  21. unsigned long st_ctime;
  22. unsigned long st_ctime_nsec;
  23. unsigned long __unused4;
  24. unsigned long __unused5;
  25. };


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多