带参数的读取和系统调用的含义

Meaning of read and syscall with arguments

我正在使用 strace 和 ltrace 工具获取有关包含用户输入提示的程序的信息。

有了strace,调用read from the prompt后,在readOnly中有一个特定文件的openat:

openat(AT_FDCWD, "file", O_RDONLY) = 3
read(3, "22d72c", 6)                    = 6

我知道 read 的第二个参数应该是一个缓冲区,并且读取从缓冲区开始,但它在这里到底是什么意思?这是否意味着它从 22d72c 位开始?或者 22d72c 是一个键并读取它的值?

至于系统调用,当我使用 ltrace 时,在对提示进行 scanf 和 fopen 打开文件,它returns 类似系统调用如:

syscall(0, 3, 0x56127f5c96c0, 6) 

这里的syscall第三个参数是什么意思? (0x56127f5c96c0)

没有。 "22d72c"read 从您的文件中读取的 6 个字符 ...只需检查 file.

的开头

确实,如果您使用 read 从 STDIN_FILENO 读取(或者例如使用 fgets;strace 将输出

read(0, 

stop在那里等待读取完成,以便它可以打印出读取的字符!


至于

syscall(0, 3, 0x56127f5c96c0, 6) 

该输出来自不知道如何解码系统调用 0 (read) 的系统调用参数的程序,因此它只显示一些合理的价值——所有的小数字都是十进制的。 0x56127f5c96c0 是指向您 read 进入的缓冲区的第一个字符的指针。

0x56127f5c96c0是传递给read的指针。它对你不是很有用,是吗? strace 足以解码系统调用,注意这是一个指针参数,并向您展示它指向的内容。