《UNIX環境高級編程》--6系統數據文件和信息

來源:本網整理

第1章 UNIX基礎知識 11.1 引言 11.2 UNIX體系結構 11.3 11.4 文件和目錄 31.5 輸入和輸出 61.6 程序和進程 81.7 出錯處理 101.8 用戶標識 121.9 信號 141.10 時間值 151.11 系統調用和庫函數 161.12 小結 17習題 18第2章 UNIX標準化及實現 192.1 引言 192.2 UNIX標準化 192.2.1 ISO C 192.2.2 IEEE POSIX 202.2.3 Single UNIX Specification 252.2.4 FIPS 262.3 UNIX系統實現 262.3.1 SVR4 262.3.2 4.4BSD 272.3.3 FreeBSD 272.3.4 Linux 272.3.5 Mac OS X 282.3.6 Solaris 282.3.7 其他UNIX系統 282.4 標準和實現的關系 282.5 限制 292.5.1 ISO C限制 292.5.2 POSIX限制 302.5.3 XSI限制 322.5.4 sysconf、pathconf和fpathconf函數 322.5.5 不確定的運行時限制 382.6 選項 422.7 功能測試宏 442.8 基本系統數據類型 452.9 標準之間的沖突 452.10 小結 46習題 46第3章 文件I/O 473.1 引言 473.2 文件描述符 473.3 open函數 483.4 creat函數 493.5 close函數 503.6 lseek函數 503.7 read函數 533.8 write函數 543.9 I/O的效率 543.10 文件共享 563.11 原子操作 593.12 dup和dup2函數 603.13 sync、fsync和fdatasync函數 613.14 fcntl函數 623.15 ioctl函數 663.16/dev/fd 673.17 小結 68習題 68第4章 文件和目錄 714.1 引言 714.2 stat、fstat和lstat函數 714.3 文件類型 724.4 設置用戶ID和設置組ID 744.5 文件訪問權限 754.6 新文件和目錄的所有權 774.7 access函數 774.8 umask函數 794.9 chmod和fchmod函數 814.10 粘住位 834.11 chown、fchown和lchown函數 844.12 文件長度 854.13 文件截短 864.14 文件系統 864.15 link、unlink、remove和rename函數 894.16 符號鏈接 914.17 symlink和readlink函數 944.18 文件的時間 944.19 utime函數 954.20 mkdir和rmdir函數 974.21 讀目錄 984.22 chdir、fchdir和getcwd函數 1024.23 設備特殊文件 1044.24 文件訪問權限位小結 1064.25 小結 106習題 107第5章 標準I/O庫 1095.1 引言 1095.2 流和FILE對象 1095.3 標準輸入、標準輸出和標準出錯 1105.4 緩沖 1105.5 打開流 1125.6 讀和寫流 1145.7 每次一行I/O 1165.8 標準I/O的效率 1175.9 二進制I/O 1195.10 定位流 1205.11 格式化I/O 1215.12 實現細節 1255.13 臨時文件 1275.14 標準I/O的替代軟件 1305.15 小結 130習題 130第6章 系統數據文件和信息 1336.1 引言 1336.2 口令文件 1336.3 陰影口令 1366.4 組文件 1376.5 附加組ID 1386.6 實現的區別 1396.7 其他數據文件 1396.8 登錄賬戶記錄 1406.9 系統標識 1416.10 時間和日期例程 1426.11 小結 146習題 146第7章 進程環境 1477.1 引言 1477.2 main函數 1477.3 進程終止 1477.4 命令行參數 1517.5 環境表 1527.6 C程序的存儲空間布局 1527.7 共享庫 1547.8 存儲器分配 1547.9 環境變量 1577.10 setjmp和longjmp函數 1597.11 getrlimit和setrlimit函數 1647.12 小結 168習題 168第8章 進程控制 1718.1 引言 1718.2 進程標識符 1718.3 fork函數 1728.4 vfork函數 1768.5 exit函數 1788.6 wait和waitpid函數 1798.7 waitid函數 1838.8 wait3和wait4函數 1848.9 競爭條件 1858.10 exec函數 1888.11 更改用戶ID和組ID 1928.12 解釋器文件 1968.13 system函數 2008.14 進程會計 2038.15 用戶標識 2088.16 進程時間 2088.17 小結 210習題 211第9章 進程關系 2139.1 引言 2139.2 終端登錄 2139.3 網絡登錄 2169.4 進程組 2189.5 會話 2199.6 控制終端 2209.7 tcgetpgrp、tcsetpgrp和tcgetsid函數 2219.8 作業控制 2229.9 shell執行程序 2259.10 孤兒進程組 2289.11 FreeBSD實現 2309.12 小結 231習題 232第10章 信號 23310.1 引言 23310.2 信號概念 23310.3 signal函數 24010.4 不可靠的信號 24210.5 中斷的系統調用 24410.6 可重入函數 24610.7 SIGCLD語義 24810.8 可靠信號術語和語義 25010.9 kill和raise函數 25110.10 alarm和pause函數 25210.11 信號集 25610.12 sigprocmask函數 25810.13 sigpending函數 25910.14 sigaction函數 26110.15 sigsetjmp和siglongjmp函數 26610.16 sigsuspend函數 26810.17 abort函數 27410.18 system函數 27610.19 sleep函數 28010.20 作業控制信號 28210.21 其他特征 28410.22 小結 285習題 285第11章 線程 28711.1 引言 28711.2 線程概念 28711.3 線程標識 28811.4 線程的創建 28811.5 線程終止 29111.6 線程同步 29711.7 小結 311習題 311第12章 線程控制 31312.1 引言 31312.2 線程限制 31312.3 線程屬性 31412.4 同步屬性 31812.5 重入 32412.6 線程私有數據 32812.7 取消選項 33112.8 線程和信號 33312.9 線程和fork 33612.10 線程和I/O 33912.11 小結 340習題 340第13章 守護進程 34113.1 引言 34113.2 守護進程的特征 34113.3 編程規則 34213.4 出錯記錄 34513.5 單實例守護進程 34813.6 守護進程的慣例 35013.7 客戶進程-服務器進程模型 35413.8 小結 354習題 354第14章 高級I/O 35514.1 引言 35514.2 非阻塞I/O 35514.3 記錄鎖 35714.4 STREAMS 37014.5 I/O多路轉接 37914.5.1 select和pselect函數 38114.5.2 poll函數 38414.6 異步I/O 38614.6.1 系統V異步I/O 38614.6.2 BSD異步I/O 38714.7 readv和writev函數 38714.8 readn和writen函數 38914.9 存儲映射I/O 39014.10 小結 395習題 396第15章 進程間通信 39715.1 引言 39715.2 管道 39815.3 popen和pclose函數 40315.4 協同進程 40815.5 FIFO 41215.6 XSI IPC 41515.6.1 標識符和鍵 41515.6.2 權限結構 41615.6.3 結構限制 41715.6.4 優點和缺點 41715.7 消息隊列 41815.8 信號量 42215.9 共享存儲 42715.10 客戶進程-服務器進程屬性 43215.11 小結 434習題 434第16章 網絡IPC:套接字 43716.1 引言 43716.2 套接字描述符 43716.3 尋址 43916.3.1 字節序 44016.3.2 地址格式 44116.3.3 地址查詢 44216.3.4 將套接字與地址綁定 44916.4 建立連接 45016.5 數據傳輸 45216.6 套接字選項 46416.7 帶外數據 46616.8 非阻塞和異步I/O 46716.9 小結 468習題 468第17章 高級進程間通信 46917.1 引言 46917.2 基于STREAMS的管道 46917.2.1 命名的STREAMS管道 47217.2.2 唯一連接 47317.3 UNIX域套接字 47617.3.1 命名UNIX域套接字 47717.3.2 唯一連接 47817.4 傳送文件描述符 48217.4.1 經由基于STREAMS的管道傳送文件描述符 48417.4.2 經由UNIX域套接字傳送文件描述符 48617.5 open服務器版本1 49317.6 open服務器版本2 49817.7 小結 505習題 505第18章 終端I/O 50718.1 引言 50718.2 綜述 50718.3 特殊輸入字符 51218.4 獲得和設置終端屬性 51618.5 終端選項標志 51618.6 stty命令 52218.7 波特率函數 52318.8 行控制函數 52418.9 終端標識 52418.10 規范模式 52918.11 非規范模式 53218.12 終端的窗口大小 53718.13 termcap,terminfo和curses 53918.14 小結 540習題 540第19章 偽終端 54119.1 引言 54119.2 概述 54119.3 打開偽終端設備 54419.3.1 基于STREAMS的偽終端 54719.3.2 基于BSD的偽終端 54919.3.3 基于Linux的偽終端 55119.4 pty_fork函數 55319.5 pty程序 55519.6 使用pty程序 55919.7 高級特性 56419.8 小結 565習題 565第20章 數據庫函數庫 56720.1 引言 56720.2 歷史 56720.3 函數庫 56820.4 實現概述 56920.5 集中式或非集中式 57220.6 并發 57420.7 構造函數庫 57420.8 源代碼 57520.9 性能 59820.10 小結 600習題 601第21章 與網絡打印機通信 60321.1 引言 60321.2 網絡打印協議 60321.3 超文本傳輸協議 60521.4 打印假脫機技術 60521.5 源代碼 60721.6 小結 644習題 645附錄A 函數原型 647附錄B 其他源代碼 677附錄C 部分習題答案 685參考書目 709索引 715www.anxorj.tw防采集請勿采集本網。

系統數據文件和信息

用戶配置文件

1. /etc/passwd

  1. UNIX口令文件 /etc/passwd/是一個ASCII文件,每一行包含很多字段,字段之間用冒號分隔。這些字段包含在<pwd.h>頭文件定義的passwd,該結構有如下成員:

    • char *pw_name:用戶名
    • char *pw_passwd:加密口令
    • uid_t pw_uid:數值用戶ID
    • gid_t pw_gid:數值組ID
    • char *pw_gecos:注釋字段
    • char *pw_dir:初始工作目錄
    • char *pw_shell:初始shell
    • char *pw_class:用戶訪問類
    • time_t pw_change:下次更改口令時間
    • time_t pw_expire:賬戶有效期時間

    我在ubuntu下作java開發,有時候也有在windows下,上次在書店買了本unix高級環境編程書,隨便翻翻看,感覺和JAVA不沾邊。是應該繼續看?還是以后再看,請不要復制了,認真幫我下巴,哥們,這是我

    關于口令文件:

    • 通常有一個用戶名為root的登錄項,其用戶ID是 0
    • 加密口令字段包含一個占位符,F在加密口令其實是放在/etc/shadow
    • 口令文件中某些字段可能為空。

      你用JAVA的話就不用學搞unix高級環境編程了。你需要做的只是不斷地深入了解JAVA的運行平臺。她位于操作系統之上。至于Windows,Unix,懂就行了,不需要深入。除非你學的是C語言。C++。那就得搞

      • 如果加密口令字段為空,則說明該用戶沒有口令,沒有口令則不能登錄
    • shell字段指定了初始shell

      前兩張應該是 Chapter 1.UNIX System Overview Chapter 2.UNIX Standardization and Implementations 主要是 unix 操作系統的簡單介紹和標準化的相關問題,和編程沒有直接關系,如果你從來沒用過

      • 若它為空,則取系統默認值(通常是/bin/sh)linux下為/bin/bash
      • 若它為/dev/null,則會阻止任何人以該字段所在行記錄中的用戶名來登錄系統
    • 用戶名如果是nobody,則任何人都可以使用它登錄系統,但是其用戶ID和組ID不提供任何特權。該用戶ID和組ID只能訪問人人皆可讀、可寫的文件
    • Linux中,沒有 pw_class,pw_change,pw_expire字段

注意如果要將一個用戶設為不能登錄

現在學的都是linux了。學完linux你可以學嵌入式,偏硬件一點。學習軟件的話,可以學安卓。

1.可以將其shell設為/bin/false/bin/true

Unix環境高級編程?Unix的環境跟Linux很接近,但Linux免費,Unix是商用的。所以你可以從熟悉Linux下手,先熟悉系統的各項功能,命令行的使用,熟悉VI Gedit等文本編輯軟件的使用,再進一步到

2.可以在/etc/shadow下將密碼字段前加!!*

  1. getpwuid/getpwnam函數:讀取口令文件:

    #include<pwd.h>struct passwd* getpwuid(uid_t uid);struct passwd* getpwnam(const char*name);

    • 參數:

      • uid:用戶ID
      • name:用戶名
    • 返回值:

      • 成功:返回passwd結構的指針
      • 失。悍祷NULL

    注意:getpwuid/getpwnam函數返回的 struct passwd結構通常是函數內部的靜態變量,因此多次調用上面的函數,該靜態變量會被覆寫。

  2. 查看整個口令文件,使用下面的函數:

    #include<pwd.h>struct passwd *getpwent(void);void setpwent(void);void endpwent(void);

    • getpwent返回值:

      • 成功:返回passwd結構的指針
      • 失。悍祷NULL
      • 到達文件尾端:返回NULL

    用法:

    • 調用getpwent時,它返回口令文件中的下一個記錄項

    返回的 struct passwd結構通常是函數內部的靜態變量,因此多次調用getpwent函數,該靜態變量會被覆寫

  3. 在第一次調用getpwent函數時,它會打開所使用的各個文件
  4. getpwent對返回的各個記錄項順序并沒有要求
  5. setpwent會反繞getpwent所使用的文件到文件起始處。即當調用setpwent之后,getpwent又會從頭開始讀取記錄項
  6. endpwent會關閉getpwent所使用的文件。在調用getpwent讀取完口令文件后,一定要調用endpwent關閉這些文件

    getpwent知道什么時候應該打開它所使用的文件(第一次被調用時),但是不知道何時應該關閉這些文件

  7. 加密口令是經單向加密算法處理過的用戶口令副本。

    因為此算法是單向的,所以不能從加密口令猜測到原始口令

    現在的UNIX將加密口令存放在一個稱作陰影口令的文件中(即文件/etc/shadow)。該文件至少應該包含用戶名和加密口令。這些字段包含在<shadow.h>頭文件的struct spwd結構中。相關的字段如下:

    • char *sp_namp:用戶登錄名
    • char *sp_pwdp:加密口令
    • int sp_lstchg:上次更改口令以來經過的時間
    • int sp_min:經過多少天后允許修改口令
    • int sp_max:經過多少天后必須修改口令
    • int sp_warn:經過多少天后如果未修改口令則系統發出警告
    • int sp_inact:經過多少天后,該賬戶是inactive
    • int sp_expire:經過多少天后,該賬戶過期
    • unsigned int sp_flag:保留字段

    其中只有用戶登錄名和加密口令這兩個字段是必須的。其他字段都是用于控制口令更改的頻率。

    注意:

    • 陰影口令文件/etc/shadow 不應該由一般用戶讀取。

      • 僅有少數幾個程序需要訪問加密口令,如login,passwd。這些程序通常是設置用戶ID為root的程序
      • 普通口令文件/etc/passwd/可以任由各用戶讀取
  8. 用于讀取陰影口令文件的函數為:

    #include<shadow.h>struct spwd *getspnam(const char*name);struct spwd *getspent(void);void setspent(void);void endspent(void);

    • getspnam參數:

      • name:用戶名
    • getspnam返回值:

      • 成功:返回spwd結構指針
      • 失。悍祷NULL
    • getspent返回值:

      • 成功:返回spwd結構指針
      • 失。悍祷NULL
      • 到達文件尾端:返回NULL

    用法:

    • 調用 getspnam時,它返回陰影口令文件中,對應用戶名的那一條記錄項

    返回的 struct spwd結構通常是函數內部的靜態變量,因此多次調用getspnam函數,該靜態變量會被覆寫

  9. 調用getspent時,它返回陰影口令文件中的下一個記錄項

    返回的 struct spwd結構通常是函數內部的靜態變量,因此多次調用getspent函數,該靜態變量會被覆寫

  10. 在第一次調用getspent函數時,它會打開所使用的各個文件
  11. getspent對返回的各個記錄項順序并沒有要求
  12. setspent會反繞getspent所使用的文件到文件起始處。即當調用setspent之后,getspent又會從頭開始讀取記錄項
  13. endspent會關閉getspent所使用的文件。在調用getspent讀取完陰影口令文件后,一定要調用endspent關閉這些文件

    getspent知道什么時候應該打開它所使用的文件(第一次被調用時),但是不知道何時應該關閉這些文件

  14. UNIX 組文件包含的字段定義在<grp.h>所定義的group結構中:

    • char *gr_name:組名
    • char *gr_passwd:加密口令
    • int gr_gid:組ID
    • char **gr_mem:指向各用戶名指針的數組

    它是一個指針數組,其中每個指針指向一個屬于該組的用戶名。該數組以null指針結尾

  15. struct_group

  16. getgrgid/getgrnam函數:查看組文件:

    #include<grp.h>struct group* getgrgid(gid_t gid);struct group* getgrnam(const char* name);

    • 參數:

      • gid:組ID
      • name:組名
    • 返回值:

      • 成功:返回group結構的指針
      • 失。悍祷NULL

    注意:getgrgid/getgrnam函數返回的 struct group結構通常是函數內部的靜態變量,因此多次調用上面的函數,該靜態變量會被覆寫。

  17. 查看整個組文件,使用下面的函數:

    #include<grp.h>struct group *getgrent(void);void setgrent(void);void endgrent(void);

    • getgrent返回值:

      • 成功:返回group結構的指針
      • 失。悍祷NULL
      • 到達文件尾端:返回NULL

    用法:

    • 調用getgrent時,它返回組文件中的下一個記錄項

    返回的 struct group結構通常是函數內部的靜態變量,因此多次調用getgrent函數,該靜態變量會被覆寫

  18. 在第一次調用getgrent函數時,它會打開所使用的各個文件
  19. getgrent對返回的各個記錄項順序并沒有要求
  20. setgrent會反繞getgrent所使用的文件到文件起始處。即當調用setgrent之后,getgrent又會從頭開始讀取記錄項
  21. endgrent會關閉getgrent所使用的文件。在調用getgrent讀取完組文件后,一定要調用endgrent關閉這些文件

    getgrent知道什么時候應該打開它所使用的文件(第一次被調用時),但是不知道何時應該關閉這些文件

  22. UNIX中還提供了附屬組ID。其中獲取和設置附屬組ID的函數為:

    #include<unistd.h>int getgroups(int gidsetsize,gid_t grouplist[]);#include<grp.h> //對Linux#include<unistd.h> //對 FreeBSD, Mac OS X, Solarisint setgroups(int ngroups,const gid_t grouplist[]);#include<grp.h> //對Linux#include<unistd.h> //對 FreeBSD, Mac OS X, Solarisint initgroups(const char *username, gid_t basegid);

    參數:

    • 對于getgroups函數:

      • gidsetsize:填入grouplist數組的附屬組ID的最大數量

        若該值為0,則函數只返回附屬組ID數,而不修改grouplist數組

      • grouplist:存放附屬組ID的數組
    • 對于setgroups函數:

      • ngroupsgrouplist數組中元素個數

        數量不能太大,不能超過NGROUPS_MAX

      • grouplist:待設置的附屬組ID的數組
    • 對于initgroups函數:

      • username:用戶名
      • basegid:用戶的base組ID(它就是在口令文件中,用戶名對于的組ID)

    返回值:

    • 對于getgroups函數:

      • 成功:返回附屬組ID的數量
      • 失。悍祷 -1
    • 對于setgroups/initgroups函數:

      • 成功:返回 0
      • 失。悍祷 -1

    用法:

    • getgroups函數將進程所屬用戶的各附屬組ID填寫到grouplist中,填入該數組的附屬組ID數最多為gidsetsize個。實際填寫到數組中的附屬組ID數由函數返回
    • setgroups函數可由超級用戶調用以便為調用進程設置附屬組ID表。
    • 由于initgroups函數會在內部調用setgroups函數,因此它也必須由超級用戶調用
  23. 除了口令文件和組文件之外,系統中還有很多其他重要的數據文件。UNIX對于這些系統數據文件提供了對應的類似的API。對于每種數據文件,至少有三個函數:

    • get函數:讀下一個記錄。如果需要還會打開該文件。

      • 此種函數通常返回一個指向某個結構的指針。
      • 當已到達文件尾端時,返回空指針
      • 大多數get函數返回指向一個靜態存儲類結構的指針,如果需要保存其內容,則需要復制該結構
    • set函數:打開相應數據文件(如果尚未打開),然后反繞該文件

      • 如果希望在相應文件起始處開始處理,則調用該函數
    • end函數:關閉相應數據文件。在結束了對相應數據文件的讀、寫操作后,總應該調用此函數以關閉所有相關文件

    另外如果數據文件支持某種形式的鍵搜索,則也提供搜索具有指定鍵的記錄的函數

    下面是各個重要的數據文件:

    說明 數據文件 頭文件 結構 附加的鍵搜索函數
    口令 /etc/passwd passwd getpwnam,getpwuid
    /etc/group group getgrnam,getgrgid
    陰影 /etc/shadow

時間和日期

  1. UNIX內核提供的基本時間服務是自 UTC 1970-01-01 00:00:00 這一特定時間以來經過的秒數。

    • 這個時間稱作日歷時間,用數據類型 time_t 表示(它包括了時間和日期)
    • UNIX 提供若干個時間函數來轉換日歷時間
  2. time函數:返回當前的日歷時間

    #include<time.h>time_t time(time_t *calptr);

    • 參數:

      • calptr:如果該指針不是NULL,則返回的日歷時間也存放在calptr指向的內存中
    • 返回值:

      • 成功:返回當前日歷時間的值
      • 失。悍祷 -1
  3. clock_gettime函數:用于獲取指定的時鐘類型的時間:

    #include<sys/time.h>int clock_gettime(clockid_t clock_id,struct timespec *tsp);

    • 參數:

      • clock_id:時鐘類型。

        • CLOCK_REALTIME:獲取實時系統時間。此時clock_gettime函數提供了與time函數類似的功能。不過在系統支持高精度時間值的情況下,clock_gettime可能比time函數得到更高精度的時間值。
        • CLOCK_MONOTONIC:獲取不帶負跳數的實時系統時間
        • CLOCK_PROCESS_CPUTIME_ID:調用進程的CPU時間
        • CLOCK_THREAD_CPUTIME_ID:調用線程的CPU時間
      • tsp:存放獲取時間的timespec結構(它把時間表示為秒和納秒)的指針
    • 返回值:

      • 成功: 返回 0
      • 失。 返回 -1
  4. clock_getres函數:時間精度調整

    #include<sys/time.h>int clock_getres(clockid_t clock_id,struct timespec *tsp);

    • 參數:

      • clock_id:時鐘類型。
      • tsp:存放時間的timespec結構(它把時間表示為秒和納秒)的指針
    • 返回值:

      • 成功: 返回 0
      • 失。 返回 -1

    clock_getres函數把參數tsp指向的timespec結構初始化為與clock_id參數對應的始終精度

  5. clock_settime函數:設置時間

    #include<sys/time.h>int clock_settime(clockid_t clock_id,const struct timepsec *tsp);

    • 參數:

      • clock_id:時鐘類型。
      • tsp:存放時間的timespec結構(它把時間表示為秒和納秒)的指針
    • 返回值:

      • 成功: 返回 0
      • 失。 返回 -1

    clock_settime函數對特定的時鐘設置時間。但是:

    • 某些始終是不能修改的
    • 需要適當的權限來修改時鐘值
  6. gettimeofday函數:更高精度的獲取當前時間(但是目前已經棄用)

    #include<sys/time.h>int gettimeofday(struct timeval *restrict tp,void *restrict tzp);

    • 參數:

      • tp:存放當前時間的timeval結構(將當前時間表示為秒和微秒)的指針
      • tzp:唯一合法值是NULL。其他任何值都產生未定義的結果
    • 返回值:總是返回 0
  7. gmtime/localtime函數:將日歷時間轉換成struct tm結構:

    #include<time.h>struct tm* gmtime(const time_t *calptr);struct tm* localtime(const time_t *calptr);

    • 參數:calptr:指向日歷時間的指針
    • 返回值:

      • 成功:指向struct tm結構的指針
      • 失。悍祷NULL

    struct tm{ int tm_sec; //秒數,范圍是 [0~60] int tm_min; //分鐘數,范圍是 [0~59] int tm_hour; //小時數,范圍是 [0~23]。午夜12點是 0 int tm_mday; //一個月中的天數,范圍是 [1~31] int tm_mon; //月數,范圍是 [0~11] ,一月是 0 int tm_year; //年數,范圍是 [1900~],如果是16則表示 1916 int tm_wday; //一個星期中的天數,范圍是 [0~6] ,周日是0 int tm_yday; //一年中的天數,范圍是 [0~365],一月一號是 0 int tm_isdst; //daylight saving time flag}

    其中秒可以超過 59 的理由是表示潤秒

    gmtime/localtime函數的區別:

    • gmtime:將日歷時間轉換成統一協調的年月日時分秒周日分解結構
    • localtime:將日歷時間轉換成本地實際(考慮本地市區和夏令時標志),由TZ環境變量指定

    TZ環境變量影響localtime/mktime/strftime這三個函數:

    • 如果定義了TZ環境變量:則這些函數將使用TZ的值代替系統默認時區

    • 如果TZ定位為空TZ=,則使用UTC作為時區
  8. mktime函數:以本地時間的年月日等作為參數,將其變化成time_t值:

    #include<time.h>time_t mktime(struct tm*tmptr);

    • 參數: tmptr:指向struct tm結構的指針
    • 返回值:

      • 成功: 返回日歷時間
      • 失。 返回 -1

    所謂的本地實際的”本地“:由 TZ環境變量指定

  9. strftime/strftime_l函數:類似printf的打印時間的函數。它們可以通過可用的多個參數來定制產生的字符串

    #include<time.h>size_t strftime(char *restrict buf,size_t maxsize,const char*restrict format, const struct tm* restrict tmptr);size_t strftime_l(char *restrict buf,size_t maxsize,const char*restrict format, const struct tm* restrict tmptr,locale_t locale);

    • 參數:

      • buf:存放格式化后的時間字符串的緩沖區的地址
      • maxsize:存放格式化后的時間字符串的緩沖區的大小
      • format:時間的格式化字符串
      • tmptr:存放時間的struct tm結構的指針

      對于strftime_l 函數:

      • locale:指定的區域
    • 返回值:

      • 成功:返回存入buf的字符數
      • 失。 返回 0

    注意:

    • 如果buf長度足夠存放格式化結果以及一個null終止符,則這兩個函數才有可能順利轉換;否則空間不夠,這兩個函數返回0,表示轉換失敗
    • strftime_l運行調用者將區域指定為參數;而strftime使用通過TZ環境變量指定的區域
    • format參數控制時間值的格式。如同printf,轉換說明的形式是百分號之后跟隨一個特定的字符,而format中的其他字符則按照原樣輸出:

      • %a:縮寫的周日名,如Thu
      • %A:周日名,如Thursday
      • %b:縮寫的月名:如Jan
      • %B:全月名,如January
      • %c:日期和時間,如Thu Jan 19 21:24:25 2012
      • %C:年的最后兩位,范圍是(00~99),如20
      • %d:月日,范圍是 (01~31),如19
      • %D日期(MM/DD/YY),如01/19/12
      • %e月日(一位數字前加空格)(1~31),如19
      • %F:ISO 8601 日期格式 (YYYY-MM-DD),如 2012-01-19
      • %g:ISO 8601 年的最后2位數(00~99),如12
      • %G:ISO 8601 的年,如 2012
      • %h:與 %b 相同,縮寫的月名
      • %H:小時(24小時制)(00~23)
      • %I:小時(12小時制)(01~12)
      • %j:年日(001~366),如019
      • %m:月(01~12),如 01
      • %M:分(00~59),如 24
      • %n:換行符
      • %pAM/PM
      • %r:本地時間(12小時制),如 09:24:52 PM
      • %R:與 %H:%M相同
      • %S:秒(00~60),如 52
      • %t:水平制表符
      • %T:同 %H:%M:%S 相同,如 21:24:52
      • %u:ISO 8601 周幾(1~7,1為周一)
      • %U:一年的星期日周數(00~53)
      • %V:ISO 8601 周數(01~53)
      • %w:周幾:(0~6,周日為0)
      • %W:一年的星期一周數(00~53)
      • %x:本地日期,如 01/19/12
      • %X:本地時間,如21:24:52
      • %y:年的最后兩位(00~99)
      • %Y:年,如2012
      • %z:ISO 8601 格式的UTC偏移量,如 -0500
      • %Z:時區名,如EST
      • %%:百分號
  10. strptime函數:它是strftime的逆向過程,把時間字符串轉換成struct tm時間

    #include<time.h>char *strptime(const char*restrict buf,const char*restrict format, struct tm*restrict tmptr);

    • 參數:

      • buf:存放已經格式化的時間字符串的緩沖區的地址
      • format:給出了buf緩沖區中的格式化時間字符串的格式
      • tmptr:存放時間的struct tm結構的指針
    • 返回值:

      • 成功:返回非NULL
      • 失。悍祷NULL

    注意:strptime的格式化說明與strftime的幾乎相同,但是下列會有區別

    • %a:縮寫或者完整的周日名
    • %A:同%a
    • %b:縮寫或者完整的月名
    • %B:同%b
    • %n:任何空白
    • %t:任何空白
$(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('
    ').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
  • ').text(i)); }; $numbering.fadeIn(1700); }); });

    本文轉載自taoyanqi8932博客,版權歸taoyanqi8932所有

    ubuntu是可以的。編譯環境的話裝好ubuntu之后就自帶了,你可以打開終端輸入gcc-v就知道你的編譯器版本了。還有你可能需要裝其他的庫文件。那本書的話建議你在沒有了解linux系統的時候,最好從基礎開始學起,不管怎么說,里面需要熟悉很多linux的命令,盡管他的名字是《UNIX環境高級編程》,但是他在序言里面說了,第二版的書涉及linux。你最好還是去了解一下系統的命令怎么用,然后再去學習內容來自www.anxorj.tw請勿采集。

免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
Copyright © 2017 www.anxorj.tw All Rights Reserved
陕西快乐10分下载