File-Descriptors

Strace - 文件描述符 3

  • July 27, 2015

我不確定文件描述符 3 在這裡是什麼意思?這個描述符是某種指向與硬碟驅動器連接以獲取文件 datlog.txt 的指針嗎?我猜是因為子常式 close() 將此整數作為參數在程式碼中的更下方。還是de描述符指向儲存文件的記憶體中的緩衝區?

open("datalog.txt", O_RDONLY)              = 3
read(3, "Hello World!!!!!!\n", 250)     = 18
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,   0) = 0x7f3f71a10000
write(1, "Read Hello World!!!!!!\n", 23) = 23
write(1, "\n", 1)                       = 1
close(3)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

Strace 顯示系統呼叫,在 GNU/Linux 上是 C 函式。這些是由每個可執行程序都需要以某種方式使用的本機 C 庫發布的。實際的 C 程式碼可以直接呼叫它們,或者使用 API 包裝函式,這通常與系統呼叫本身非常直接對應。

這意味著您可以通過查看相應 API 函式的文件來破譯大多數 sys 呼叫,因為簽名通常是相同的。例如:

open("datalog.txt", O_RDONLY)

下面是 GNU C 的簽名open(),來自man 2 open. 手冊的第 2 節是所有系統呼叫1:

int open(const char *pathname, int flags);

如果你不會說 C,這需要一個字元串路徑、一個整數標誌(在這種情況下O_RDONLY意味著只讀)並返回一個整數。

該整數是一個文件描述符,它與其他低級 C 輸入/輸出函式一起使用,例如read(). Strace 顯示 之後的值=open()在本例中為3。這是 POSIX/GNU C 的簽名read()

ssize_t read(int fd, void *buf, size_t count);

第一個參數是一個整數文件描述符。


  1. 請注意,術語“系統呼叫”是指來自庫的真實係統呼叫或 API 包裝函式,因為它們通常是相同的。第 2 節實際上是後者的文件。從技術上講,它是 GNU API,但它非常符合POSIX,後者也有官方文件——例如,這裡的open(). 並非所有 *nix 系統都使用 GNU C 庫,但它們都有一些等價的,並且上面的邏輯仍然適用。

引用自:https://unix.stackexchange.com/questions/218436