网络编程中的hook应该怎么翻译合适?

hook的意思是钩子,那一般在编程的场景中可以翻译成“钩子函数”?
不过翻译成这样对我理解原作者意思并没有啥帮助,查了一下,钩子函数和回调函数是两个不同的意思.

遇到问题的位置:

The hook for this custom memory allocation is the asynchronous operation’s completion handler.
The handler identifies the larger context in which the operation is being performed. By passing this completion handler to the initiating function, Asio is able to allocate the necessary memory prior to signalling the operating system to start the asynchronous operation

来源是:http://www.open-std.org/jtc1/...

阅读 5.1k
2 个回答

hook和回调不是一个东西。用例子来说吧。
假设我要使用http发送请求。
如果我要在请求前加上我的cookie,回调函数做不了,因为此时还没有发出请求,更别说回调结果了。
而钩子函数可以,比如有个beforeRequest的钩子,你可以在这里设置一些参数,设置完之后才会真正发出请求

尝试总结一下.
通常来说, 回调函数被认为是一种特殊化的hook函数,区分点在于调用的时间

A callback could be thought of as a specific kind of hook

就拿asio的异步调用来举例子. asio保证当异步操作结束后会调用回调函数.

socket_.async_read_some(boost::asio::buffer(data_),
    // custom_alloc_handler<Handler>(a, h);
    make_custom_alloc_handler(allocator_, [this, self](boost::system::error_code ec, std::size_t length))){
        if(!ec) do_write(length);
    }));

socket_上执行异步的读取操作,参数二实际上传入一个函数对象,这里面有两部分:

  • 第一个参数传递了内存分配对象,定制化了回调函数内存分配和释放的方式
  • 第二个参数是一个lambda表达式,作为回调函数.
    首先asio利用allocator提供的内存分配方式分配内存存储回调函数; 当异步读取工作结束后,调用回调函数.

第一个动作就可以理解成hook:钩子函数,支持用户自定义操作,用来替代默认的行为(在这个场景下,替换的是内存的分配释放策略)
第二个动作就理解成回调函数:asio库保证在读取完事件触发后调用,没有默认的行为,一定要提供.

可以看到在这种情况下,回调函数不过是调度时间确定client端自定义的行为. 是不是一定要特定事件触发呢?未必,STL中提供的各种泛型算法都最后一个参数都支持用户自定义,而这个时候的调用时间也是不可见的,从这个角度上来说,回调函数和hook实际上又没啥区别了,比如std::accumulate的实现如下.

template<class InputIt, class T, class BinaryOperation>
T accumulate(InputIt first, InputIt last, T init, 
             BinaryOperation op)
{
    for (; first != last; ++first) {
        init = op(init, *first);
    }
    return init;
}

怎么区分hook和回调呢?我的意见是没必要区分了,对于client端来说不过是提供了一个可调用对象,支持特定操作的定制化,至于调用时间/触发方式,server端决定. 叫它hook或者回调又有啥关系呢.

回到原始问题,作者也是基本上把回调函数看做是泛化的hook函数了.

The hook for this custom memory allocation is the asynchronous operation’s completion handler
// 用户自定义的内存分配器的hook就是此异步操作的回调函数.

参考
what-is-meantin-programming-by-the-term-hook-in-programming:
callback functions in c++

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进