Linux頭文件整理

linux常用頭文件詳解

POSIX標準定義的頭文件

<dirent.h>        目錄項

<fcntl.h>         文件控制

<fnmatch.h>    文件名匹配類型

<glob.h>    路徑名模式匹配類型

<grp.h>        組文件

<netdb.h>    網絡數據庫操作

<pwd.h>        口令文件

<regex.h>    正則表達式

<tar.h>        TAR歸檔值

<termios.h>    終端I/O

<unistd.h>    符號常量

<utime.h>    文件時間

<wordexp.h>    字符擴展類型

————————-

<arpa/inet.h>    INTERNET定義

<net/if.h>    套接字本地接口

<netinet/in.h>    INTERNET地址族

<netinet/tcp.h>    傳輸控制協議定義

————————-

<sys/mman.h>    內存管理聲明

<sys/select.h>    Select函數

<sys/socket.h>    套接字藉口

<sys/stat.h>    文件狀態

<sys/times.h>    進程時間

<sys/types.h>    基本系統數據類型

<sys/un.h>    UNIX域套接字定義

<sys/utsname.h>    系統名

<sys/wait.h>    進程控制

——————————

POSIX定義的XSI擴展頭文件

<cpio.h>    cpio歸檔值

<dlfcn.h>    動態鏈接

<fmtmsg.h>    消息顯示結構

<ftw.h>        文件樹漫遊

<iconv.h>    代碼集轉換使用程序

<langinfo.h>    語言信息常量

<libgen.h>    模式匹配函數定義

<monetary.h>    貨幣類型

<ndbm.h>    數據庫操作

<nl_types.h>    消息類別

<poll.h>    輪詢函數

<search.h>    搜索表

<strings.h>    字符串操作

<syslog.h>    系統出錯日誌記錄

<ucontext.h>    用戶上下文

<ulimit.h>    用戶限制

<utmpx.h>    用戶帳戶數據庫

—————————–

<sys/ipc.h>    IPC(命名管道)

<sys/msg.h>    消息隊列

<sys/resource.h>資源操作

<sys/sem.h>    信號量

<sys/shm.h>    共享存儲

<sys/statvfs.h>    文件系統信息

<sys/time.h>    時間類型

<sys/timeb.h>    附加的日期和時間定義

<sys/uio.h>    矢量I/O操作

——————————

POSIX定義的可選頭文件

<aio.h>        異步I/O

<mqueue.h>    消息隊列

<pthread.h>    線程

<sched.h>    執行調度

<semaphore.h>    信號量

<spawn.h>     實時spawn接口

<stropts.h>    XSI STREAMS接口

<trace.h>     事件跟蹤

3、 C/C++頭文件一覽

C

#i nclude <assert.h>    //設定插入點

#i nclude <ctype.h>     //字符處理

#i nclude <errno.h>     //定義錯誤碼

#i nclude <float.h>     //浮點數處理

#i nclude <iso646.h>        //對應各種運算符的宏

#i nclude <limits.h>    //定義各種數據類型最值的常量

#i nclude <locale.h>    //定義本地化C函數

#i nclude <math.h>     //定義數學函數

#i nclude <setjmp.h>        //異常處理支持

#i nclude <signal.h>        //信號機制支持

#i nclude <stdarg.h>        //不定參數列表支持

#i nclude <stddef.h>        //常用常量

#i nclude <stdio.h>     //定義輸入/輸出函數

#i nclude <stdlib.h>    //定義雜項函數及內存分配函數

#i nclude <string.h>    //字符串處理

#i nclude <time.h>     //定義關於時間的函數

#i nclude <wchar.h>     //寬字符處理及輸入/輸出

#i nclude <wctype.h>    //寬字符分類

傳統C++

#i nclude <fstream.h>    //改用<fstream>

#i nclude <iomanip.h>    //改用<iomainip>

#i nclude <iostream.h>   //改用<iostream>

#i nclude <strstrea.h>   //該類不再支持,改用<sstream>中的stringstream

————————————————————————————————

標準C++ 

#i nclude <algorithm>    //STL 通用算法

#i nclude <bitset>     //STL 位集容器

#i nclude <cctype>          //字符處理

#i nclude <cerrno>      //定義錯誤碼

#i nclude <cfloat>     //浮點數處理

#i nclude <ciso646>         //對應各種運算符的宏

#i nclude <climits>     //定義各種數據類型最值的常量

#i nclude <clocale>     //定義本地化函數

#i nclude <cmath>      //定義數學函數

#i nclude <complex>     //複數類

#i nclude <csignal>         //信號機制支持

#i nclude <csetjmp>         //異常處理支持

#i nclude <cstdarg>         //不定參數列表支持

#i nclude <cstddef>         //常用常量

#i nclude <cstdio>      //定義輸入/輸出函數

#i nclude <cstdlib>     //定義雜項函數及內存分配函數

#i nclude <cstring>     //字符串處理

#i nclude <ctime>      //定義關於時間的函數

#i nclude <cwchar>      //寬字符處理及輸入/輸出

#i nclude <cwctype>     //寬字符分類

#i nclude <deque>      //STL 雙端隊列容器

#i nclude <exception>    //異常處理類

#i nclude <fstream>     //文件輸入/輸出

#i nclude <al>   //STL 定義運算函數(代替運算符)

#i nclude <limits>      //定義各種數據類型最值常量

#i nclude <list>      //STL 線性列表容器

#i nclude <locale>          //本地化特定信息

#i nclude <map>       //STL 映射容器

#i nclude <memory>          //STL通過分配器進行的內存分配

#i nclude <new>             //動態內存分配

#i nclude <numeric>         //STL常用的數字操作

#i nclude <iomanip>     //參數化輸入/輸出

#i nclude <ios>       //基本輸入/輸出支持

#i nclude <iosfwd>     //輸入/輸出系統使用的前置聲明

#i nclude <iostream>     //數據流輸入/輸出

#i nclude <istream>     //基本輸入流

#i nclude <iterator>        //STL迭代器

#i nclude <ostream>     //基本輸出流

#i nclude <queue>      //STL 隊列容器

#i nclude <set>       //STL 集合容器

#i nclude <sstream>     //基於字符串的流

#i nclude <stack>      //STL 堆棧容器

#i nclude <stdexcept>    //標準異常類

#i nclude <streambuf>    //底層輸入/輸出支持

#i nclude <string>     //字符串類

#i nclude <typeinfo>        //運行期間類型信息

#i nclude <utility>     //STL 通用模板類

#i nclude <valarray>        //對包含值的數組的操作

#i nclude <vector>     //STL 動態數組容器

————————————————————————————————

C99增加的部分

#i nclude <complex.h>   //複數處理

#i nclude <fenv.h>    //浮點環境

#i nclude <inttypes.h>  //整數格式轉換

#i nclude <stdbool.h>   //布爾環境

#i nclude <stdint.h>   //整型環境

#i nclude <tgmath.h>   //通用類型數學宏

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/wubin1124/archive/2009/12/09/4971359.aspx

***********************************************************************************************************************************

程序在使用一個函數之前,應該首先聲明該函數。爲了便於使用,通常的做法是把同一類函數或數據結構以及常數的聲明放在一個頭文件(header file)中。頭文件中也可以包括任何相關的類型定義和宏(macros)。在程序源代碼文件中則使用預處理指令“#include”來引用相關的頭文件。

  程序中如下形式的一條控制行語句將會使得該行被文件filename的內容替換掉:

  # include

  當然,文件名filename中不能包含 > 和換行字符以及 “、’、\、或 /* 字符。編譯系統會在定義的一系列地方搜索這個文件。類似地,下面形式的控制行會讓編譯器首先在源程序所在目錄中搜索filename文件:

  # include “filename”

  如果沒有找到,編譯器再執行同上面一樣的搜索過程。在這種形式中,文件名filename中不能包含換行字符和 “、’、\、或 /* 字符,但允許使用 > 字符。

  在一般應用程序源代碼中,頭文件與開發環境中的庫文件有着不可分割的緊密聯繫,庫中的每個函數都需要在頭文件中加以聲明。應用程序開發環境中的頭文件(通常放置在系統/usr/include/目錄中)可以看作是其所提供函數庫(例如libc.a)中函數的一個組成部分,是庫函數的使用說明或接口聲明。在編譯器把源代碼程序轉換成目標模塊後,鏈接程序(linker)會把程序所有的目標模塊組合在一起,包括用到的任何庫文件中的模塊。從而構成一個可執行的程序。

  對於標準C函數庫來講,其最基本的頭文件有15個。每個頭文件都表示出一類特定函數的功能說明或結構定義,例如I/O操作函數、字符處理函數等。有關標準函數庫的詳細說明及其實現可參照Plauger編著的《The Standard C Library》一書。

  而對於本書所描述的內核源代碼,其中涉及的頭文件則可以看作是對內核及其函數庫所提供服務的一個概要說明,是內核及其相關程序專用的頭文件。在這些頭文件中主要描述了內核所用到的所有數據結構、初始化數據、常數和宏定義,也包括少量的程序代碼。除了幾個專用的頭文件以外(例如塊設備頭文件blk.h),Linux 0.12內核中所用到的頭文件都放在內核代碼樹的include/目錄中。因此編譯Linux 0.12內核無需使用開發環境提供的位於/usr/include/目錄下的任何頭文件。當然,tools/build.c程序除外。因爲這個程序雖然被包含在內核源代碼樹中,但它只是一個用於組合創建內核映像文件的工具程序或應用程序,不會被鏈接到內核代碼中。

  從0.95版開始,內核代碼樹中的頭文件需要複製到/usr/include/linux目錄下才能順利地編譯內核。即從該版內核開始頭文件已經與開發環境使用的頭文件合二爲一。

  14.1 include/目錄下的文件

  內核所用到的頭文件都保存在include/目錄下。該目錄下的文件如表11-1所示。這裏需要說明一點:爲了方便使用和兼容性,Linus在編制內核程序頭文件時所使用的命名方式與標準C庫頭文件的命名方式相似,許多頭文件的名稱甚至其中的一些內容都與標準C庫的頭文件基本相同,但這些內核頭文件仍然是內核源代碼或與內核有緊密聯繫的程序專用的。在一個Linux系統中,它們與標準庫的頭文件並存。通常的做法是將這些頭文件放置在標準庫頭文件目錄中的子目錄下,以讓需要用到內核數據結構或常數的程序使用。

  另外,也由於版權問題,Linus試圖重新編制一些頭文件以取代具有版權限制的標準C庫的頭文件。因此這些內核源代碼中的頭文件與開發環境中的頭文件有一些重疊的地方。在Linux系統中,列表14-1中的asm/、linux/和sys/三個子目錄下的內核頭文件通常需要複製到標準C庫頭文件所在的目錄(/usr/include)中,而其他一些文件若與標準庫的頭文件沒有衝突則可以直接放到標準庫頭文件目錄下,或者改放到這裏的三個子目錄中。

  asm/目錄下主要用於存放與計算機體系結構密切相關的函數聲明或數據結構的頭文件。例如Intel CPU 端口IO彙編宏文件io.h、中斷描述符設置彙編宏頭文件system.h等。linux/目錄下是Linux內核程序使用的一些頭文件。其中包括調度程序使用的頭文件sched.h、內存管理頭文件mm.h和終端管理數據結構文件tty.h等。而sys/目錄下存放着幾個與內核資源相關頭文件。不過從0.98版開始,內核目錄樹下sys/目錄中的頭文件被全部移到了linux/目錄下。

  Linux 0.12版內核中共有32個頭文件(*.h),其中asm/子目錄中含有4個,linux/子目錄中含有10個,sys/子目錄中含有5個。從下一節開始我們首先描述include/目錄下的13個頭文件,然後依次說明每個子目錄中的文件。說明順序按照文件名稱排序進行。

linux常用頭文件詳解(轉) - by myself - 勿以惡小而爲之,勿以善小而不爲

 14.2 a.out.h文件

  14.2.1 功能描述

  在Linux 內核中,a.out.h文件用於定義被加載的可執行文件結構。主要用於加載程序fs/exec.c中。該文件不屬於標準C庫,它是內核專用的頭文件。但由於與標準庫的頭文件名沒有衝突,因此在Linux系統中一般可以放/usr/include/目錄下,以供涉及相關內容的程序使用。該頭文件中定義了目標文件的一種a.out(Assembly out)格式。Linux 0.12系統中使用的.o文件和可執行文件就採用了這種目標文件格式。

  a.out.h文件包括三個數據結構定義和一些相關的宏定義,因此文件可被相應地分成三個部分:

  ◆第1~108行給出並描述了目標文件執行頭結構和相關的宏定義。

  ◆第109~185行對符號表項結構的定義和說明。

  ◆第186~217行對重定位表項結構進行定義和說明。

  由於該文件內容比較多,因此對其中三個數據結構以及相關宏定義的詳細說明放在程序列表後。

  從0.96版內核開始,Linux系統直接採用了GNU的同名頭文件a.out.h。因此造成在Linux 0.9x下編譯的程序不能在Linux 0.1x系統上運行。下面對兩個a.out頭文件的不同之處進行分析,並說明如何讓0.9x下編譯的一些不是用動態鏈接庫的執行文件也能在0.1x下運行。

  Linux 0.12使用的a.out.h文件與GNU同名文件的主要區別在於exec結構的第一個字段a_magic。GNU的該文件字段名稱是a_info,並且把該字段又分成3個子域:標誌域(Flags)、機器類型域(Machine Type)和魔數域(Magic Number)。同時爲機器類型域定義了相應的宏N_MACHTYPE和N_FLAGS,如圖14-1所示。

linux常用頭文件詳解(轉) - by myself - 勿以惡小而爲之,勿以善小而不爲

    在Linux 0.9x系統中,對於採用靜態庫連接的執行文件,圖中各域註釋中括號內的值是該字段的默認值。這種二進制執行文件開始處的4個字節是:

  0x0b, 0x01, 0x64, 0x00

  而這裏的頭文件僅定義了魔數域。因此,在Linux 0.1x系統中一個a.out格式的二進制執行文件開始的4個字節是:

  0x0b, 0x01, 0x00, 0x00

  可以看出,採用GNU的a.out格式的執行文件與Linux 0.1x系統上編譯出的執行文件的區別僅在機器類型域。因此我們可以把Linux 0.9x上的a.out格式執行文件的機器類型域(第3個字節)清零,讓其運行在0.1x系統中。只要被移植的執行文件所調用的系統調用都已經在0.1x系統中實現即可。在開始重新組建Linux 0.1x根文件系統中的很多命令時,作者就採用了這種方法。

  在其他方面,GNU的a.out.h頭文件與這裏的a.out.h沒有什麼區別。

   14.2.3 a.out執行文件格式

  Linux內核0.12版僅支持a.out(Assembly out)執行文件和目標文件的格式,雖然這種格式目前已經漸漸不用,而使用功能更爲齊全的ELF(Executable and Link Format)格式,但是由於其簡單性,作爲入門的學習材料比較適用。下面全面介紹一下a.out格式。

  在頭文件a.out.h中聲明瞭三個數據結構以及一些宏。這些數據結構描述了系統上目標文件的結構。在Linux 0.12系統中,編譯產生的目標模塊文件(簡稱模塊文件)和鏈接生成的二進制可執行文件均採用a.out格式。這裏統稱爲目標文件。一個目標文件由7部分(7節)組成。它們依次爲:

  (1)執行頭部分(exec header)。該部分中含有一些參數(exec結構),內核使用這些參數把執行文件加載到內存中並執行,而鏈接程序(ld)使用這些參數將一些模塊文件組合成一個可執行文件。這是目標文件唯一必要的組成部分。

  (2)代碼段部分(text segment)。含有程序執行時被加載到內存中的指令代碼和相關數據。可以以只讀形式被加載。

  (3)數據段部分(data segment)。這部分含有已經初始化過的數據,總是被加載到可讀寫的內存中。

  (4)代碼重定位部分(text relocations)。這部分含有供鏈接程序使用的記錄數據。在組合目標模塊文件時用於定位代碼段中的指針或地址。

  (5)數據重定位部分(data relocations)。類似於代碼重定位部分的作用,但是用於數據段中指針的重定位。

  (6)符號表部分(symbol table)。這部分同樣含有供鏈接程序使用的記錄數據,用於在二進制目標模塊文件之間對命名的變量和函數(符號)進行交叉引用。

  (7)字符串表部分(string table)。該部分含有與符號名對應的字符串。

  每個目標文件均以一個執行數據結構(exec structure)開始。該數據結構的形式如下:

linux常用頭文件詳解(轉) - by myself - 勿以惡小而爲之,勿以善小而不爲

    各個字段的功能如下:

  1)a_magic——該字段含有三個子字段,分別是標誌字段、機器類型標識字段和魔數字段,參見圖11-1。不過對於Linux 0.12系統其目標文件只使用了其中的魔數子字段,並使用宏N_MAGIC()來訪問,它唯一地確定了二進制執行文件與其他加載的文件之間的區別。該子字段中必須包含以下值之一:

  ◆OMAGIC。表示代碼和數據段緊隨在執行頭後面並且是連續存放的。內核將代碼和數據段都加載到可讀寫內存中。編譯器編譯出的目標文件的魔數是OMAGIC(八進制0407)。

  ◆NMAGIC。同OMAGIC一樣,代碼和數據段緊隨在執行頭後面並且是連續存放的。然而內核將代碼加載到了只讀內存中,並把數據段加載到代碼段後下一頁可讀寫內存邊界開始。

  ◆ZMAGIC。內核在必要時從二進制執行文件中加載獨立的頁面。執行頭部、代碼段和數據段都被鏈接程序處理成多個頁面大小的塊。內核加載的代碼頁面是隻讀的,而數據段的頁面是可寫的。鏈接生成的可執行文件的魔數即是ZMAGIC(0413,即0x10b)。

  2)a_text——該字段含有代碼段的長度值,字節數。

  3)a_data——該字段含有數據段的長度值,字節數。

  4)a_bss——含有bss段的長度,內核用其設置在數據段後初始的break(brk)。內核在加載程序時,這段可寫內存顯現出處於數據段後面,並且初始時爲全零。

  5)a_syms——含有符號表部分的字節長度值。

  6)a_entry——含有內核將執行文件加載到內存中以後,程序執行起始點的內存地址。

  7)a_trsize——該字段含有代碼重定位表的大小,是字節數。

  8)a_drsize——該字段含有數據重定位表的大小,是字節數。

    在a.out.h頭文件中定義了幾個宏,這些宏使用exec結構來測試一致性或者定位執行文件中各個部分(節)的位置偏移值。這些宏有:

  ◆N_BADMAG(exec)。如果a_magic字段不能被識別,則返回非零值。

  ◆N_TXTOFF(exec)。代碼段的起始位置字節偏移值。

  ◆N_DATOFF(exec)。數據段的起始位置字節偏移值。

  ◆N_DRELOFF(exec)。數據重定位表的起始位置字節偏移值。

  ◆N_TRELOFF(exec)。代碼重定位表的起始位置字節偏移值。

  ◆N_SYMOFF(exec)。符號表的起始位置字節偏移值。

  ◆N_STROFF(exec)。字符串表的起始位置字節偏移值。

  重定位記錄具有標準的格式,它使用重定位信息(relocation_info)結構來描述,如下所示:

linux常用頭文件詳解(轉) - by myself - 勿以惡小而爲之,勿以善小而不爲

    該結構中各字段的含義如下:

  1)r_address——該字段含有需要鏈接程序處理(編輯)的指針的字節偏移值。代碼重定位的偏移值是從代碼段開始處計數的,數據重定位的偏移值是從數據段開始處計算的。鏈接程序會將已經存儲在該偏移處的值與使用重定位記錄計算出的新值相加。

  2)r_symbolnum——該字段含有符號表中一個符號結構的序號值(不是字節偏移值)。鏈接程序在算出符號的絕對地址以後,就將該地址加到正在進行重定位的指針上。(如果r_extern比特位是0,那麼情況就不同,見下面。)

  3)r_pcrel——如果設置了該位,鏈接程序就認爲正在更新一個指針,該指針使用pc相關尋址方式,是屬於機器碼指令部分。當運行程序使用這個被重定位的指針時,該指針的地址被隱式地加到該指針上。

  4)r_length——該字段含有指針長度的2的次方值:0表示1字節長,1表示2字節長,2表示4字節長。

  5)r_extern——如果被置位,表示該重定位需要一個外部引用;此時鏈接程序必須使用一個符號地址來更新相應指針。當該位是0時,則重定位是“局部”的。鏈接程序更新指針以反映各個段加載地址中的變化,而不是反映一個符號值的變化。在這種情況下,r_symbolnum字段的內容是一個n_type值;這類字段告訴鏈接程序被重定位的指針指向那個段。

  6)r_pad——Linux系統中沒有使用的4個比特位。在寫一個目標文件時最好全置0。

  符號將名稱映射爲地址(或者更通俗地講是字符串映射到值)。由於鏈接程序對地址的調整,一個符號的名稱必須用來表示其地址,直到已被賦予一個絕對地址值。符號是由符號表中固定長度的記錄以及字符串表中的可變長度名稱組成。符號表是nlist結構的一個數組,如下所示:

linux常用頭文件詳解(轉) - by myself - 勿以惡小而爲之,勿以善小而不爲

其中各字段的含義爲:

  1)n_un.n_strx——含有本符號的名稱在字符串表中的字節偏移值。當程序使用nlist()函數訪問一個符號表時,該字段被替換爲n_un.n_name字段,這是內存中字符串的指針。

  2)n_type——用於鏈接程序確定如何更新符號的值。使用第146~154行開始的位屏蔽(bitmasks)碼可以將8比特寬度的n_type字段分割成三個子字段,如圖14-2所示。對於N_EXT類型位置位的符號,鏈接程序將它們看作是“外部的”符號,並且允許其他二進制目標文件對它們的引用。N_TYPE屏蔽碼用於鏈接程序感興趣的比特位:

linux常用頭文件詳解(轉) - by myself - 勿以惡小而爲之,勿以善小而不爲

    ◆N_UNDF。一個未定義的符號。鏈接程序必須在其他二進制目標文件中定位一個具有相同名稱的外部符號,以確定該符號的絕對數據值。特殊情況下,如果n_type字段是非零值,並且沒有二進制文件定義了這個符號,則鏈接程序在BSS段中將該符號解析爲一個地址,保留長度等於n_value的字節。如果符號在多於一個二進制目標文件中都沒有定義並且這些二進制目標文件對其長度值不一致,則鏈接程序將選擇所有二進制目標文件中最大的長度。

  ◆N_ABS。一個絕對符號。鏈接程序不會更新一個絕對符號。

  ◆N_TEXT。一個代碼符號。該符號的值是代碼地址,鏈接程序在合併二進制目標文件時會更新其值。

  ◆N_DATA。一個數據符號。與N_TEXT類似,但是用於數據地址。對應代碼和數據符號的值不是文件的偏移值而是地址;爲了找出文件的偏移,就有必要確定相關部分開始加載的地址並減去它,然後加上該部分的偏移。

  ◆N_BSS。一個BSS符號。與代碼或數據符號類似,但在二進制目標文件中沒有對應的偏移。

  ◆N_FN。一個文件名符號。在合併二進制目標文件時,鏈接程序會將該符號插入在二進制文件中的符號之前。符號的名稱就是給予鏈接程序的文件名,而其值是二進制文件中首個代碼段地址。鏈接和加載時不需要文件名符號,但對於調式程序非常有用。

  ◆N_STAB。屏蔽碼用於選擇符號調式程序(例如gdb)感興趣的位。其值在stab()中說明。

  3)n_other——該字段按照n_type確定的段,提供有關符號重定位操作的符號獨立性信息。目前,n_other字段的最低4位含有兩個值之一:AUX_FUNC和AUX_OBJECT(有關定義參見)。AUX_FUNC將符號與可調用的函數相關,AUX_OBJECT將符號與數據相關,無論它們是位於代碼段還是數據段。該字段主要用於鏈接程序ld,用於動態可執行程序的創建。

  4)n_desc——保留給調式程序使用;鏈接程序不對其進行處理。不同的調試程序將該字段用作不同的用途。

  5)n_value——含有符號的值。對於代碼、數據和BSS符號,這是一個地址;對於其他符號(例如調式程序符號),值可以是任意的。

  字符串表由長度爲unsigned long後跟一null結尾的符號字符串組成。長度代表整個表的字節大小,所以在32位的機器上其最小值(即第1個字符串的偏移)總是4。

  14.3 const.h文件

  14.3.1 功能描述

  該文件定義了i節點中文件屬性和類型i_mode字段所用到的一些標誌位常量符號。

  14.3.2 代碼註釋

linux常用頭文件詳解(轉) - by myself - 勿以惡小而爲之,勿以善小而不爲

        </div>
            </div>
        </article>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章