Strace - 文件描述符 3

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 +++

答案1

斯特雷斯展示系统调用,在 GNU/Linux 上是 C 函数。这些是由本机 C 库发布的,每个可执行进程都需要以某种方式使用它们。实际的 C 代码可以直接调用它们,或者使用 API 包装函数,该函数通常非常直接地对应于系统调用本身。

这意味着您可以通过查看相应 API 函数的文档来破译大多数系统调用,因为签名通常是相同的。例如:

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 库,但它们都有一些等效库,并且上述逻辑仍然适用。

相关内容