ZBLOG

这里的original_read调用的是自己写的这个read吗

在你提供的代码片段中,original_read 是一个函数指针,它被用来保存原始的 read 函数地址。这个原始 read 函数是通过 dlsym(RTLD_NEXT, "read") 来获取的,而不是直接调用自己写的 read 函数。

具体分析:

  1. 函数指针定义:

    ssize_t (*original_read)(int fd, void *buf, size_t count) = NULL;
    

    这里定义了一个名为 original_read 的函数指针,它可以指向与标准库中 read 函数相同签名的任何函数。

  2. 查找原始 read 函数:

    if (!original_read) {
       original_read = dlsym(RTLD_NEXT, "read");
       ...
    }
    

    当第一次调用你的自定义 read 函数时,如果 original_read 仍然是 NULL,就会调用 dlsym(RTLD_NEXT, "read") 来查找下一个共享库中的原始 read 实现并将其赋值给 original_read。这样就能够保持对真实 read() 的引用。

  3. 调用原始函数:

    ssize_t result = original_read(fd, buf, count);
    

    此行实际上是在调用系统或标准库提供的真实 read() 函数,而不是递归地调用自己写的那个自定义版本。这保证了在执行完你的自定义逻辑后,依然能够正确地读取数据。

总结

  • 你自己的实现和原始实现之间是区分开的。
  • 当你使用 dlsym() 获取到的是动态链接库中的真正实现(即操作系统提供的标准库中的实现)。
  • 自己编写的那个自定义版本不会直接再去调用自己,这样可以避免无限递归的问题,并确保程序功能正常工作。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20501

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?