【问题标题】:Meaning of read and syscall with arguments带参数的读取和系统调用的含义
【发布时间】:2021-06-02 09:16:06
【问题描述】:

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

使用strace,从提示中调用read后,readOnly中有一个特定文件的openat:

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

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

至于系统调用,当我使用 ltrace 时,我会在 scanf 提示符和 fopen 打开文件,它返回类似的系统调用,如:

syscall(0, 3, 0x56127f5c96c0, 6) 

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

【问题讨论】:

    标签: c system-calls


    【解决方案1】:

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

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

    read(0, 
    

    并且停止在那里等待读取完成,以便打印出读取的字符!


    至于

    syscall(0, 3, 0x56127f5c96c0, 6) 
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • (Antti Haapala 在我回答后将这些内容添加到他自己的答案中,在 5 分钟的窗口内,所以它看起来更旧,但事实并非如此)
      • 没错,fgitw 的好处,虽然它不是抄袭,我打算写它 - 我只是做了中间保存 只是为了得到 i> 我的“第一锅!!!”效果。
      猜你喜欢
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2016-01-30
      相关资源
      最近更新 更多