- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试学习如何使用 libuv。我在 mac OS X 上下载并安装了库。我可以编译和运行小型测试程序,一个只启动一个回调循环然后退出,因为没有观察者,另一个创建一个空闲观察者并在时间用完时退出。
我一直在尝试查看文件 io 的示例,但遇到了问题。获取文件描述符的函数原型(prototype)为:
int uv_fs_open(uv_loop_t* loop,
uv_fs_t* req, // second argument
const char* path,
int flags,
int mode,
uv_fs_cb cb)
我已将示例代码缩减到仍然会出现错误的最小值。
#include <stdio.h>
#include <uv.h>
uv_fs_t open_req;
void on_open(uv_fs_t);
void on_read(uv_fs_t);
void on_write(uv_fs_t);
int main(int argc, char **argv) {
uv_fs_open(uv_default_loop(), &open_req, argv[1], O_RDONLY, 0, on_open);
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
return 0;
}
void on_open(uv_fs_t *req) {
if (req->result != -1) {
fprintf(stderr, "function called \n");
}
else {
fprintf(stderr, "error opening file: %d\n", req->errorno);
}
uv_fs_req_cleanup(req);
}
我的 open_req 声明与完整代码示例中出现的 close_req 声明完全一样,不会产生错误。我添加了 open_req 的声明,因为编译器给我一个“‘open_req’未在此范围内声明”的错误。当我添加声明时,它将错误更改为“从‘void (*)(uv_fs_t)’到‘void (*)(uv_fs_t*)’的无效转换”。我得到了同样的错误,而不是声明是否在 main 内。如果我将声明更改为指针声明
uv_fs_t* open_req;
然后我得到错误:
cannot convert uv_fs_t** to uv_fs_t* for argument ‘2’ to
int uv_fs_open(uv_loop_t*, uv_fs_t*, const char*, int, int, void (*)(uv_fs_t*))
我正在尝试查看实际的 libuv 代码,看看我是否能弄清楚,但代码很大,我正在使用此处的“libuv 简介”:http://nikhilm.github.com/uvbook/这就是示例代码的来源。
是否有任何其他示例代码来源可供我用来尝试弄清楚这个库?我的声明中有什么明显的错误吗?我不确定在哪里可以找到有关如何使用 libuv 的说明或示例。
编辑更新在 libuv 代码中,在 uv.h 文件中。我发现
typedef struct uv_fs_s uv_fs_t;
我一直在代码中寻找的其中一件事是实际定义此结构的位置。我使用 google 搜索了 typedef 并了解了一些有关如何使用 typedef 来命名的信息,这样您就不必在每次要声明结构实例时都键入 struct。尽管有些人似乎认为这是一种糟糕的做法,而另一些人则认为它很棒。我为获得最小样本而删除的部分内容作为另一个名为 close_req 的 us_fs_t 类型的声明。我直接从那个文件中复制了我的声明格式。
我会看看我能找到什么关于函数指针的信息,我对它们只是模糊地熟悉,它至少给了我一个开始寻找的地方。
我找到了 uv_fs_open 的函数定义。
int uv_fs_open(uv_loop_t* loop,
uv_fs_t* req,
const char* path,
int flags,
int mode,
uv_fs_cb cb) {
INIT(OPEN);
PATH;
req->flags = flags;
req->mode = mode;
POST;
}
最佳答案
您声明函数的原型(prototype) uv_fs_open
是
int uv_fs_open(uv_loop_t* loop,
uv_fs_t* req,
const char* path,
int flags,
int mode,
uv_fs_cb cb)
注意第二个参数的类型是uv_fs_t*
.所以当你声明 open-rec
作为
uv_fs_t open_req;
然后调用uv_fs_open()
与
uv_fs_open(uv_default_loop(), &open_req, argv[1], O_RDONLY, 0, on_open);
第二个参数(&open_req
)接受open_req
的地址并创建所需的指针。这应该工作得很好。但是,从您的原始错误消息来看,我认为您没有发布所有相关代码。让我们看看这个错误信息:
invalid conversion from ‘void (*)(uv_fs_t)’ to ‘void (*)(uv_fs_t*)’
这表明编译器需要一个指向函数的指针,该函数返回 void 并采用单个参数,该参数是指向 uv_fs_t
的指针。 .另一方面,您提供了一个指向函数的指针,该函数返回 void 并采用 uv_fs_t
类型的单个参数。 (即不是指向 uv_fs_t
的指针)。
这表明 open_req
是一个函数(或指向函数的指针)。为了进一步帮助您,请使用此函数的声明以及如何初始化 open_req
来编辑您的原始问题。如果它是指向函数的指针而不是函数本身的名称,则为变量。
编辑:
再次查看您的问题后,open_req
很可能不会导致原始错误。您应该将代码改回原来的样子。
另一方面,on_open
很可能导致问题。你用原型(prototype)声明这个函数
void on_open(uv_fs_t);
但是定义的第一行是
void on_open(uv_fs_t *req)
删除 *
从函数定义的第一行开始,看看会发生什么。
关于c - 变量声明,使用 libuv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15624074/
我正在尝试运行来自 https://github.com/aspnet/home 的示例 我遵循了 documentation 中的所有步骤但我无法让它发挥作用。 我正在运行 dnx 。 kestre
我真的很困惑 libev 和 libuv。 libuv 只是 POSIX 系统上 libev 的包装器吗? 如果不是,它的区别在哪里? 最佳答案 不再,因为 libuv-v0.9 Here is th
我想尝试在 dlang 中使用 libuv。我下载了这样的 dlang 绑定(bind): git clone git@github.com:tamediadigital/libuv.git 现在我接
我知道事件循环在单个进程(因此,在单个内核)上运行,但是我想知道从那里启动线程时会发生什么。 如果我使用uv_thread_create或uv_queue_work启动多个线程,它们是否可以在多个内核
我想知道需要采取什么预防措施,以便能够安全地从C++中的多个线程向libuv事件循环添加回调。 更多详细信息 我有一些多线程C++ 11代码,我想对其进行修改以使用libuv的网络通信API。我不想每
我正在 libuv 中初始化一个循环,但是如果我需要在初始化循环之后但在调用 uv_run 之前返回,如何正确清理所有内存和文件描述符?这是我的示例代码,loop 为 uv_loop_t*,serve
如果我有这个功能,你会如何在字节码虚拟机中使用libuv void vm_run(vm_t* vm); 它启动虚拟机来执行代码,只要用户的代码这样做,它就会继续运行,现在我想在VM语言中添加异步内容,
要求:UDP 服务器在接收到 UDP 数据包后,将接收到的数据包存储到两个队列之一。每个队列都关联一个工作线程,关联的线程从队列前端拾取数据包,对其进行处理并将其写入内存缓存系统。 约束:解决方案必须
当我尝试发送一些基本的 UDP 消息时,它看起来好像没有发送。我尝试运行我在网上找到的几个示例。我正在使用 SocketTest v3.0.0 来测试服务器/客户端。当我测试 TCP 发送时,一切都按
uv_write 的文档指出 [ 1 ]: Note The memory pointed to by the buffers must remain valid until the callback
我正在使用 libsourcey,它使用 libuv 作为其底层 I/O 网络层。一切都已设置并且似乎正在运行(因为我只是在制作原型(prototype)和试验,所以还没有测试任何东西)。但是,我要求
我正在尝试为 C++ 库编写 nodejs 绑定(bind),但我似乎遇到了障碍。 我正在尝试使对 C++ 库的所有调用都是异步的,这就是我使用 libuv 的原因。我基本上是在关注 this教程。
在 libuv 中,您最终可能会因过多的工作或错误代码而占用工作线程。是否有一个简单的函数可以检查工作线程或线程队列的健康状况?它不必是 100% 确定性的,毕竟不可能确定工作线程是卡在慢速代码上还是
server 将在调用 start 后在新线程中启动(服务器有自己的循环)。问题是程序立即结束,因为默认循环中没有注册事件。我想要的是通过 uv_default_loop 模拟 pthread_joi
我正在尝试找出如何修复我在使用 Valgrind 运行此程序时遇到的这些内存泄漏。泄漏发生在 nShell_client_main 中的两个分配。但我不是确定如何正确释放它们。 我已经尝试在 nShe
我正在使用 libuv。我读过 http://nikhilm.github.com/uvbook/processes.html并且仍然无法弄清楚如何捕获子进程的标准输出,以便它在父进程中可用(但不能代
我有一个使用 libuv 库的应用程序。它运行默认循环: uv_run(uv_default_loop()); 应用出现故障时如何优雅退出?目前我正在按照以下示例进行操作: uv_tcp_t* tcp
我正在评估 libuv 作为我正在编写的 C/c++ 服务器的库。该协议(protocol)以长度为前缀,所以一旦我可以从流中读取一个 32 位整数,我就应该能够知道我应该分配多大的缓冲区。文档说 u
例如我有 2 个线程 .我要从主线程(线程 1)停止服务器。 线程1:主程序 线程 2:TcpServer 来自 libuv 库: /* * This function will stop the
我正在尝试运行与 LWS 库一起安装的“libwebsockets-test-server”,但它无法运行,因为“lwsts[31616]: libuv 支持未编译”。 我已经检查过是否安装了 lib
我是一名优秀的程序员,十分优秀!