乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       XeonGate 2019-10-21

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

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

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

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

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

      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)的唯一性來取一個數(shù)值,和文件的權(quán)限無關(guān)。

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

      簡單驗證:

                         

      用到的代碼,文件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ù)的一個陷阱

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

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

            這是一個很重要的問題,希望能謹(jǐn)記!?。?/p>

           所以要確保key值不變,要么確保ftok()的文件不被刪除,要么不用ftok(),指定一個固定的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ù)的第二個參數(shù)的后8個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,錯誤代碼存于errno
      4. struct stat結(jié)構(gòu)體的定義如下:
      5. /usr/include/asm/stat.h
      6. struct stat {
      7. unsigned long st_dev;//文件的設(shè)備編號
      8. unsigned long st_ino;//節(jié)點
      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. };


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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多