File-Descriptors
Strace - 文件描述符 3
我不確定文件描述符 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);
第一個參數是一個整數文件描述符。