为什么要叫钩子?

2021-06-04 16:18:19 +08:00
 balabalaguguji

很多软件的事件回调都叫钩子,也就是 hook,例如 SVN 和 Git

不理解为什么叫钩子,感觉不是很好理解,难道这有什么故事

7306 次点击
所在节点    程序员
51 条回复
touchwithe
2021-06-04 17:50:00 +08:00
会想起以前的青葱岁月,回调和句柄真是令我百思不得其解
Jooooooooo
2021-06-04 17:52:49 +08:00
@balabalaguguji 句柄真的是翻译的太差了.
X0ray
2021-06-04 17:56:23 +08:00
@Jooooooooo 套接字不服
MonoBiao
2021-06-04 17:59:19 +08:00
@X0ray 安全套接字
raaaaaar
2021-06-04 18:02:14 +08:00
好莱坞模式是个啥。。
stabc
2021-06-04 18:03:20 +08:00
翻译成“挂钩”会更加直观。“钩子”会让人误解为那种带个绳子的钩子。 而实际上墙上的挂钩。
fs418082760
2021-06-04 18:05:19 +08:00
你知道”卖钩子的“是什么意思吗?
dianso
2021-06-04 18:09:38 +08:00
北方程序员表示我们叫轮子
RainyH2O
2021-06-04 18:10:02 +08:00
计算机有不少概念虽然在不同上下文环境下叫不同的名字,但在抽象的层面上实际上就是一回事。
至于钩子的理解,形象点就好比正常走路,衣服被钩子钩住了不得不停下来处理,改变了原来的走路过程。就这么理解着呗。
换个上下文可能就叫中断、劫持、注入、回调、生命周期函数、模板方法、过滤器、拦截器、切面、异常控制流等等了。
具体细节上可能有些有很大区别,但抽象起来无非一个定义好的过程某个位置被加了另一段过程呗。
来源的话可就难考究了。
hubqin
2021-06-04 18:24:16 +08:00
hook 不就是事件,观察者模式么
BeautifulSoap
2021-06-04 18:25:39 +08:00
哎,这贴看下来真的觉得楼上太多人都对本地程序的开发没了解了


hook 这个词和翻译没关系,lz 明显没有做过原生类软件的开发,hook 不等于 callback,lz 搞错了这两者的区别了,所以对 hook 的理解有点偏差

HOOK 一般是用来形容软件开发中与 "截取" 有关的技术的词语。注意不是回调,而是截取,这里的截取尤其是指截取 API

比如在 Windows 下,你可以写个程序把自己的 dll 注入到目标进程中,这样每当目标程序调用系统的 API 或自己程序内部的函数的时候,你都可以直接截取到目标程序的 API 调用,你可以在程序调用 API 前随意修改传给系统的参数,也可以修改系统 API 返回给目标程序的数据。利用 HOOK 你可以在不修改目标程序的情况下,任意修改它的所有输入输出。这就叫 HOOK

Android 的 Xposed 框架就是个 HOOK 框架,可以不修改 app 任意 HOOK 安卓系统的 API,功能才如此强大

所以钩子这个词其实是非常形象且准确的,你把钩子扔进目标程序里(甚至直接扔到整个系统里都行),当对应的 API 被调用时候,就自动上钩了,上钩后执行你的程序,这就是“钩子”这个词的意思

框架里说的钩子同理,只不过框架的钩子是开发者事先就埋好的你可以随意调用。实现方式可能和回调很像,但并不等于回调
danhahaha
2021-06-04 18:25:41 +08:00
钩子就是自动化流水线上的打工仔,机器处理不了的,放几个打工仔,这里拧个螺丝,那里做下质检,程序员就是车间主任,整天来回折腾这些打工仔
hubqin
2021-06-04 18:25:48 +08:00
@Jooooooooo 当年学 c+
+看到这个 句柄 很长时间难以理解
balabalaguguji
2021-06-04 18:29:59 +08:00
@BeautifulSoap #31 嗯,感谢科普
Helsing
2021-06-04 19:17:36 +08:00
@BeautifulSoap #31
这个是最好的解释了,Android 如果了解过插桩和插件化对这个就比较好理解了
aaniao002
2021-06-04 19:21:24 +08:00
所以别看中文书籍。真看不懂。
foMM
2021-06-04 19:21:25 +08:00
我还以为楼主刚到西北地区
expkzb
2021-06-04 22:30:02 +08:00
特定事件理解为鱼,钓鱼的过程叫 hook
irytu
2021-06-05 02:35:52 +08:00
玩过 iOS 越狱开发吗,全是 hook…… 记得上古时期有个上手的工具就直接叫 captainhook😂,或者去了解一下 Linux 下面的库打桩机制,比如利用 LD_PRELOAD 来 hook 标准库的一些函数调用
ragnaroks
2021-06-05 08:47:59 +08:00
callback+inject=hook

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/781410

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX