在C语言中,可以使用回调函数来实现与Node.js的交互。以下是一个简单的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <uv.h>
// 回调函数类型
typedef void (*Callback)(const char*);
// C函数,接收回调函数作为参数
void performAsyncTask(Callback callback) {
// 模拟异步任务
uv_timer_t timer;
uv_loop_t* loop = uv_default_loop();
uv_timer_init(loop, &timer);
// 设置定时器回调,在1秒后执行回调函数
uv_timer_start(&timer, [](uv_timer_t* handle) {
// 执行回调函数并传递结果
callback("异步任务完成");
// 停止定时器
uv_timer_stop(handle);
// 关闭循环
uv_loop_close(handle->loop);
}, 1000, 0);
}
// 导出给Node.js使用的接口函数
extern "C" {
void asyncTaskWrapper(void (*callback)(const char*)) {
performAsyncTask(callback);
}
}
在上述示例中,我们定义了一个名为performAsyncTask的C函数,它接收一个回调函数作为参数。在这个函数内部,我们模拟了一个异步任务(使用libuv库),并在1秒后执行回调函数,并传递结果。
然后,通过导出asyncTaskWrapper接口给Node.js使用。这个包装器接受一个指向回调函数的指针,并将其传递给performAsyncTask。
在Node.js中,可以使用ffi(Foreign Function Interface)或node-ffi模块来调用C函数,并传递回调函数。以下是一个使用Node.js的示例:
const ffi = require('ffi');
// 定义C接口
const lib = ffi.Library('./your_c_library.so', {
'asyncTaskWrapper': ['void', ['pointer']]
});
// 创建JavaScript回调函数
const callback = ffi.Callback('void', ['string'], function(result) {
console.log(result);
});
// 调用C接口并传递回调函数
lib.asyncTaskWrapper(callback);
// 注意:如果你的C库是在Windows平台编译的,你需要将库文件扩展名改为 '.dll'
以上代码演示了如何使用ffi模块加载和调用包含我们定义的C接口的共享库(.so文件)。我们还创建了一个JavaScript回调函数,并通过传递它给C接口进行注册。
这样,当异步任务完成时,C代码会执行回调函数,并将结果传递给Node.js,然后在Node.js中打印出结果。
内容由零声教学AI助手提供,问题来源于学员提问




