3

为什么要叫钩子?

 2 years ago
source link: https://www.v2ex.com/t/781410
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
为什么要叫钩子? - V2EX

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

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

51 条回复    2021-06-05 20:03:36 +08:00

ericgui

ericgui   2 天前

wafm

wafm   2 天前

原本:
1+1 =2
-----------------------------------

HOOK:
1+1 =2
----------- ----------
|--------------|
1+1=2 了,要干点啥吗?


类似把程序链条勾起来再套回去

wafm

wafm   2 天前   ❤️ 2

HOOK:
1+1 =2
----------- ----------
|--------------|
1+1=2 了,要干点啥吗?


类似把程序链条勾起来再套回去

asdasdasdzxc

asdasdasdzxc   2 天前

可以看看 AOP 的概念

wafm

wafm   2 天前

@balabalaguguji 那是因为现在的各种组件和库封装的太好了,稍微学习一下汇编,你会很快理解为啥叫 HOOK,钩子

falcon05

falcon05   2 天前 via iPhone   ❤️ 1

因为可以挂东西,Wordpress 里特别典型

chinvo

chinvo   2 天前   ❤️ 3

就是程序本身是条 pipeline, hook (钩子) hook (挂) 到 pipeline 上面

kop1989

kop1989   2 天前

我认为钩子和回调,在逻辑上没有本质区别。
区别应该只存在于开发端。

钩子往往是将逻辑填充到预定的方法体 /空函数中。
而回调是传递函数指针。

suiterchik

suiterchik   2 天前   ❤️ 13

这个应该来源于设计模式中的模板模式和好莱坞准则,也就是上层定义一个未实现的方法(也就是钩子方法),留给下层实现,在需要的时候上层调用这个钩子方法

就好比二楼的住户在窗口放了一个篮子下楼,楼下的人把食物放到篮子上,当二楼的住户饿了就把篮子拉上去,如果不饿,那就在那放着。在这个比喻中,二楼就是上层实现,一楼是底层实现,篮子就是钩子方法,食物就是钩子的具体逻辑。低层组件将自己挂钩到系统上,高层组件决定什么时候和如何调用低层组件

IgniteWhite

IgniteWhite   2 天前

突出钩子的这么一个特点:比如你在一根管子里,如果你向前伸出一个钩子,它的钩尖是反向的。比钩子大的东西,在通过管道的时候就容易被勾住。有人会想,滤网不也是这样吗,是,但是钩子钩到东西以后,你一拉它,挂载钩子上的东西就能跟着拉出来。

ztxcccc

ztxcccc   2 天前

一个正常的流程就像箱子在传送带上,hook 会在需要的时候把箱子勾走做别的事情,然后放回去

skinny

skinny   2 天前

其实不少词比较难理解,翻译要占大部分原因。

EgoTao

EgoTao   2 天前

感觉是个语言问题,而不是题主不理解什么是钩子,只是不理解为什么叫钩子。 很多词都是不太理解英语的话就很难理解,单纯的从英语直译中文都不好理解。 比如 hook (钩子)、socket (套接字)等等。这种翻译还是挺多的吧,就是翻译成中文以后,并不能直观的理解这个东西是啥。 可能需要大佬解释一下 hook 实际的使用(语言)场景之类的才好理解。

SlipStupig

SlipStupig   2 天前

@kop1989 hook 和 callback 虽然很多时候用法一样,但是并不完全一样啊,hook 会改变原有流程

oneisall8955

oneisall8955   2 天前

想起 handle,句柄,把手?

rioshikelong121

rioshikelong121   2 天前   ❤️ 1

"In computer programming, the term hooking covers a range of techniques used to alter or augment the behaviour of an operating system, of applications, or of other software components by intercepting function calls or messages or events passed between software components. Code that handles such intercepted function calls, events or messages is called a hook."

https://en.wikipedia.org/wiki/Hooking

balabalaguguji

balabalaguguji   2 天前

@oneisall8955 #18 是的,当年学 C++时,经常碰到句柄,什么文件句柄,就感觉完全不知道是什么

touchwithe

touchwithe   2 天前 via iPhone

会想起以前的青葱岁月,回调和句柄真是令我百思不得其解

raaaaaar

raaaaaar   2 天前 via Android

好莱坞模式是个啥。。

stabc

stabc   2 天前   ❤️ 1

翻译成“挂钩”会更加直观。“钩子”会让人误解为那种带个绳子的钩子。 而实际上墙上的挂钩。

fs418082760

fs418082760   2 天前

你知道”卖钩子的“是什么意思吗?

dianso

dianso   2 天前

北方程序员表示我们叫轮子

RainyH2O

RainyH2O   2 天前

计算机有不少概念虽然在不同上下文环境下叫不同的名字,但在抽象的层面上实际上就是一回事。
至于钩子的理解,形象点就好比正常走路,衣服被钩子钩住了不得不停下来处理,改变了原来的走路过程。就这么理解着呗。
换个上下文可能就叫中断、劫持、注入、回调、生命周期函数、模板方法、过滤器、拦截器、切面、异常控制流等等了。
具体细节上可能有些有很大区别,但抽象起来无非一个定义好的过程某个位置被加了另一段过程呗。
来源的话可就难考究了。

hubqin

hubqin   2 天前 via Android

hook 不就是事件,观察者模式么

BeautifulSoap

BeautifulSoap   2 天前   ❤️ 31

哎,这贴看下来真的觉得楼上太多人都对本地程序的开发没了解了


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

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

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

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

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

框架里说的钩子同理,只不过框架的钩子是开发者事先就埋好的你可以随意调用。实现方式可能和回调很像,但并不等于回调

danhahaha

danhahaha   2 天前

钩子就是自动化流水线上的打工仔,机器处理不了的,放几个打工仔,这里拧个螺丝,那里做下质检,程序员就是车间主任,整天来回折腾这些打工仔

hubqin

hubqin   2 天前 via Android

@Jooooooooo 当年学 c+
+看到这个 句柄 很长时间难以理解

Helsing

Helsing   2 天前 via iPhone

@BeautifulSoap #31
这个是最好的解释了,Android 如果了解过插桩和插件化对这个就比较好理解了

aaniao002

aaniao002   2 天前 via Android

所以别看中文书籍。真看不懂。

foMM

foMM   2 天前

我还以为楼主刚到西北地区

expkzb

expkzb   1 天前

特定事件理解为鱼,钓鱼的过程叫 hook

irytu

irytu   1 天前 via iPhone

玩过 iOS 越狱开发吗,全是 hook…… 记得上古时期有个上手的工具就直接叫 captainhook😂,或者去了解一下 Linux 下面的库打桩机制,比如利用 LD_PRELOAD 来 hook 标准库的一些函数调用

ragnaroks

ragnaroks   1 天前   ❤️ 1

callback+inject=hook

xiaofan305

xiaofan305   1 天前 via iPhone

歪一个楼,我觉得 handle 可以翻译成“抓手”,形象贴切

TinyWang

TinyWang   1 天前

我还以为楼主问的是屁股

Cloutain

Cloutain   1 天前   ❤️ 1

安全选手的眼中,callback 是系统或框架或某某程序提供的官方接口,hook 是自己硬塞进去的

chenyu8674

chenyu8674   1 天前

玩过黄金矿工没

ming159

ming159   1 天前

主要是为了 扩展性 . 比如你设计一个框架可以这样来做

// 可以是接口,也可以是函数,或者是其他
[函数|接口] hook=null;

// 注册钩子函数
function addHook([函数|接口] hook){
this.hook=hook;
}

// 此函数就可以由于钩子函数的存在,在不修改代码的基础上通过传入不同的钩子实现不同的逻辑
function something(Object args){
// 比如首先参数验证,然后做一些处理
if(this.hook!=null){
args = this.hook(args); // 调用钩子函数
}
// 后续的操作
// 如果没有注册钩子函数,则系统就是默认行为.
// 如果之前添加了自定义的钩子函数,可以对系统默认行为作出自定义
}

winglight2016

winglight2016   1 天前

个人理解:回调是嵌入到主线程的代码(耦合),而回调是第三方主线程来控制被 hook 的进程在状态触发时去调用 hook 的,所以差别非常大,在架构上不是一回事儿。

wupher

wupher   1 天前

最早写 VC 的时候,远在上个世纪,MSDN 的文档就称相关机制及 API 为 API Hook,Dll Hook 。

我觉得是相承下来的吧。

johnsona

johnsona   1 天前 via iPhone

钩子中间件 aop 就是调另外一个东西之前把你钩住 执行完我的方法再走

shayuvpn0001

shayuvpn0001   1 天前

@BeautifulSoap 楼层里就你解释的是最到位的,现在本地应用程序的确了解透彻的人不多了。很多话术不过是把以前的东西包装了一下,换了个应用场景,很多没见过的都以为是什么新发明的东西。

Leigg

Leigg   1 天前 via Android

中间价,切面,钩子有很大相似度

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK