Luvref

Nvim :help 页面,由 生成来源, 使用 tree-sitter-vimdoc 解析器。


LUV 参考手册
本文件记录了 LibUV 库的 Lua 绑定,该库用于 Nvim 的事件循环,并可通过 vim.uv 从 Lua 访问(例如,uv.version() 被暴露为 vim.uv.version())。
有关本手册的信息,请参见 luv-credits
有关更多示例,请参见 https://github.com/luvit/luv/tree/master/examples
luv (https://github.com/luvit/luv) 项目在 Lua 代码中提供了对跨平台支持库 libuv (https://github.com/libuv/libuv) 的访问权限。它主要为 luvit (https://github.com/luvit/luvit) 项目开发,作为内置的 uv 模块,但可以在其他 Lua 环境中使用。
有关核心 libuv 库的更多信息,请参见原始 libuv 文档页面 (https://docs.libuv.org/)。
TCP 回显服务器示例
这是一个展示 TCP 回显服务器的小示例
local uv = vim.uv
local server = uv.new_tcp()
server:bind("127.0.0.1", 1337)
server:listen(128, function (err)
  assert(not err, err)
  local client = uv.new_tcp()
  server:accept(client)
  client:read_start(function (err, chunk)
    assert(not err, err)
    if chunk then
      client:write(chunk)
    else
      client:shutdown()
      client:close()
    end
  end)
end)
print("TCP server listening at 127.0.0.1 port 1337")
uv.run() -- an explicit run call is necessary outside of luvit
模块布局
luv 库包含一个 Lua 模块,为了简便起见,以下称为 uv。该模块主要由函数组成,其名称与其原始 libuv 版本相对应。例如,libuv 函数 uv_tcp_binduv.tcp_bind() 中有一个 luv 版本。目前,仅存在两个非函数字段:uv.constantsuv.errno,它们是表。
函数与方法
除了简单的函数外,luv 还提供了一个可选的基于方法的 API。例如,uv.tcp_bind(server, host, port) 可以作为 server:bind(host, port) 替代调用。请注意,第一个参数 server 成为对象,并且从函数名中删除了 tcp_。方法形式在下面存在的地方进行了说明。
同步与异步函数
接受回调的函数是异步的。这些函数可能会立即将结果返回给调用者以指示其初始状态,但其最终执行将推迟到至少下一次 libuv 循环迭代。完成之后,它们的回调将使用传递给它的任何结果执行。
不接受回调的函数是同步的。这些函数会立即将结果返回给调用者。
某些(通常是 FS 和 DNS)函数可以同步或异步地工作。如果为这些函数提供回调,则它们将异步工作;如果没有提供回调,则它们将同步工作。
伪类型
定义了一些独特的类型。这些不是 Lua 中的实际类型,但它们在这里用于方便地记录一致的行为
fail: 一个可断言的 nil, string, string 元组(参见 luv-error-handling
callable: 一个 function;或一个带有 __call 元方法的 tableuserdata
buffer: 一个 string 或一个 string 的连续 table
threadargs: 类型为 nilbooleannumberstringuserdata 的可变参数 (...);参数数量限制为 9 个。
本文档主要是 libuv API 文档 (https://docs.libuv.org/en/v1.x/api.html) 在 luv 的 Lua API 上下文中的重述。低级实现细节以及未公开的 C 函数和类型不会在此处记录,除非它们与 Lua 模块中看到的行为相关。
luv-error-handling — 错误处理
luv-version-checking — 版本检查
uv_loop_t — 事件循环
uv_req_t — 基本请求
uv_handle_t — 基本句柄
uv_timer_t — 计时器句柄
uv_prepare_t — 准备句柄
uv_check_t — 检查句柄
uv_idle_t — 空闲句柄
uv_async_t — 异步句柄
uv_poll_t — 轮询句柄
uv_signal_t — 信号句柄
uv_process_t — 进程句柄
uv_stream_t — 流句柄
uv_tcp_t — TCP 句柄
uv_pipe_t — 管道句柄
uv_tty_t — TTY 句柄
uv_udp_t — UDP 句柄
uv_fs_event_t — FS 事件句柄
uv_fs_poll_t — FS 轮询句柄
luv-file-system-operations — 文件系统操作
luv-thread-pool-work-scheduling — 线程池工作调度
luv-dns-utility-functions — DNS 工具函数
luv-miscellaneous-utilities — 杂项工具
luv-metrics-operations — 指标操作

错误处理 luv-error-handling

在 libuv 中,错误是负编号的常量;但是,虽然这些错误通过 uv.errno 公开,但用于处理它们的函数并未公开给 luv 用户。相反,如果遇到内部错误,luv 函数将返回一个可断言的 nil, err, name 元组给调用者。
nil 代表性地表示失败
err 是一个格式为 {name}: {message} 的字符串
{name}uv_err_name 内部提供的错误名称
{message}uv_strerror 内部提供的可读消息
name 与用于构造 err 的字符串相同
此元组在下面被称为 fail 伪类型。
当成功调用函数时,它将返回与函数操作相关的值,或返回整数 0 以指示成功,或者有时什么也不返回。这些情况在下面进行了说明。
uv.errno uv.errno
一个表值,它以映射形式公开错误常量,其中键是错误名称(没有 UV_ 前缀),其值是一个负数。有关更多详细信息,请参见 Libuv 的“错误常量”页面。 (https://docs.libuv.org/en/v1.x/errors.html#error-constants)
E2BIG: 参数列表过长。
EACCES: 权限被拒绝。
EADDRINUSE: 地址已在使用。
EADDRNOTAVAIL: 地址不可用。
EAFNOSUPPORT: 不支持地址族。
EAGAIN: 资源暂时不可用。
EAI_ADDRFAMILY: 不支持地址族。
EAI_AGAIN: 临时故障。
EAI_BADFLAGS: ai_flags 值无效。
EAI_BADHINTS: hints 的值无效。
EAI_CANCELED: 请求已取消。
EAI_FAIL: 永久故障。
EAI_FAMILY: 不支持 ai_family。
EAI_MEMORY: 内存不足。
EAI_NODATA: 没有地址。
EAI_NONAME: 未知节点或服务。
EAI_OVERFLOW: 参数缓冲区溢出。
EAI_PROTOCOL: 解析的协议未知。
EAI_SERVICE: 套接字类型不可用。
EAI_SOCKTYPE: 套接字类型不受支持。
EALREADY: 连接已在进行中。
EBADF: 文件描述符无效。
EBUSY: 资源繁忙或已锁定。
ECANCELED: 操作已取消。
ECHARSET: 无效的 Unicode 字符。
ECONNABORTED: 软件导致连接中止。
ECONNREFUSED: 连接被拒绝。
ECONNRESET: 连接被对等方重置。
EDESTADDRREQ: 需要目标地址。
EEXIST: 文件已存在。
EFAULT: 系统调用参数中的地址无效。
EFBIG: 文件太大。
EHOSTUNREACH: 主机不可达。
EINTR: 系统调用被中断。
EINVAL: 参数无效。
EIO: i/o 错误。
EISCONN: 套接字已连接。
EISDIR: 对目录进行非法操作。
ELOOP: 遇到太多符号链接。
EMFILE: 打开的文件过多。
EMSGSIZE: 消息过长。
ENAMETOOLONG: 名称过长。
ENETDOWN: 网络已关闭。
ENETUNREACH: 网络不可达。
ENFILE: 文件表溢出。
ENOBUFS: 没有可用的缓冲区空间。
ENODEV: 没有此设备。
ENOENT: 没有此文件或目录。
ENOMEM: 内存不足。
ENONET: 机器不在网络上。
ENOPROTOOPT: 协议不可用。
ENOSPC: 设备上没有剩余空间。
ENOSYS: 未实现函数。
ENOTCONN: 套接字未连接。
ENOTDIR: 不是目录。
ENOTEMPTY: 目录不为空。
ENOTSOCK: 对非套接字进行套接字操作。
ENOTSUP: 套接字不支持此操作。
EOVERFLOW: 值太大,无法用于定义的数据类型。
EPERM: 操作不被允许。
EPIPE: 管道已断开。
EPROTO: 协议错误。
EPROTONOSUPPORT: 不支持协议。
EPROTOTYPE: 协议类型与套接字不匹配。
ERANGE: 结果太大。
EROFS: 只读文件系统。
ESHUTDOWN: 传输端点关闭后无法发送。
ESPIPE: 无效的查找。
ESRCH: 没有此进程。
ETIMEDOUT: 连接超时。
ETXTBSY: 文本文件繁忙。
EXDEV: 不允许跨设备链接。
UNKNOWN: 未知错误。
EOF: 文件结尾。
ENXIO: 没有此设备或地址。
EMLINK: 链接过多。
ENOTTY: 设备的 ioctl 不合适。
EFTYPE: 文件类型或格式不合适。
EILSEQ: 非法字节序列。
ESOCKTNOSUPPORT: 不支持套接字类型。
uv.version() uv.version()
返回打包到单个整数中的 libuv 版本。每个组件使用 8 位,补丁号存储在 8 个最低有效位中。例如,在 libuv 1.2.3 中,这将是 0x010203。
返回:integer
uv.version_string() uv.version_string()
以字符串形式返回 libuv 版本号。例如,在 libuv 1.2.3 中,这将是“1.2.3”。对于非发行版,版本后缀将被包含在内。
返回:string

uv_loop_t — 事件循环 luv-event-loop uv_loop_t

事件循环是 libuv 功能的核心部分。它负责轮询 I/O 并调度基于不同事件源运行的回调。
在 luv 中,每个加载库的 Lua 状态都有一个隐式的 uv 循环。只要每个线程都有自己的 Lua 状态及其相应的 uv 循环,您就可以在多线程环境中使用此库。此循环未在 Lua 模块中直接公开给用户。
uv.loop_close() uv.loop_close()
关闭所有内部循环资源。在正常执行中,循环在被 Lua 的垃圾回收器回收时会自动关闭,因此无需显式调用 loop_close()。仅在循环执行完毕且所有打开的句柄和请求已关闭后才调用此函数,否则它将返回 EBUSY
返回值:0fail
uv.run([{mode}]) uv.run()
参数
mode: stringnil(默认值:"default"
此函数运行事件循环。它将根据指定的模式以不同的方式运行
"default": 运行事件循环,直到没有更多活动且引用的句柄或请求。如果调用了 uv.stop() 并且仍然存在活动句柄或请求,则返回 true。在所有其他情况下返回 false
"once": 轮询 I/O 一次。注意,如果没有任何待处理的回调,此函数将阻塞。完成后返回 false(没有活动的句柄或请求剩余),或如果预期更多回调(意味着您应该在将来的某个时间再次运行事件循环),则返回 true
"nowait": 轮询 I/O 一次,但如果没有任何待处理的回调,则不阻塞。完成后返回 false(没有活动的句柄或请求剩余),或如果预期更多回调(意味着您应该在将来的某个时间再次运行事件循环),则返回 true
返回值:booleanfail
注意: Luvit 在加载用户代码后会隐式调用 uv.run(),但如果您直接使用 luv 绑定,则需要在注册初始事件回调集后调用它以启动事件循环。
uv.loop_configure({option}, {...}) uv.loop_configure()
参数
option: string
...: 取决于 option,见下文
设置其他循环选项。除非另有说明,否则您通常应该在第一次调用 uv_run() 之前调用此函数。
支持的选项
"block_signal": 在轮询新事件时阻塞信号。loop_configure() 的第二个参数是信号名称(作为小写字符串)或信号编号。此操作目前仅针对 "sigprof" 信号实现,以在使用采样分析器时抑制不必要的唤醒。请求其他信号将以 EINVAL 失败。
"metrics_idle_time": 累积事件循环在事件提供者中花费的空闲时间量。此选项对于使用 metrics_idle_time() 是必需的。
以下是一个对该函数的有效调用的示例
uv.loop_configure("block_signal", "sigprof")
返回值:0fail
注意: 请做好处理 ENOSYS 错误的准备;这意味着循环选项不受平台支持。
uv.loop_mode() uv.loop_mode()
如果循环正在运行,则返回一个字符串,指示正在使用的模式。如果循环未运行,则返回 nil
返回值:stringnil
uv.loop_alive() uv.loop_alive()
如果循环中存在引用的活动句柄、活动请求或正在关闭的句柄,则返回 true;否则返回 false
返回值:booleanfail
uv.stop() uv.stop()
停止事件循环,导致 uv.run() 尽快结束。这不会早于下一次循环迭代发生。如果在阻塞 I/O 之前调用了此函数,则循环在本次迭代中不会阻塞 I/O。
返回值:无。
uv.backend_fd() uv.backend_fd()
获取后端文件描述符。仅支持 kqueue、epoll 和事件端口。
这可以与 uv.run("nowait") 结合使用,在一个线程中轮询并在另一个线程中运行事件循环的回调
返回值:integernil
注意: 在所有平台上,将 kqueue fd 嵌入另一个 kqueue 轮询集中都不起作用。将其添加到 fd 中不是错误,但它永远不会生成事件。
uv.backend_timeout() uv.backend_timeout()
获取轮询超时。返回值以毫秒为单位,或 -1 表示没有超时。
返回:integer
uv.now() uv.now()
返回以毫秒为单位的当前时间戳。时间戳在事件循环刻度开始时缓存,有关详细信息和基本原理,请参阅 uv.update_time()
时间戳从时间上的某个任意点单调递增。不要对起点做出假设,你只会失望。
返回:integer
注意: 如果您需要亚毫秒级精度,请使用 uv.hrtime()
uv.update_time() uv.update_time()
更新事件循环对“现在”的理解。Libuv 在事件循环刻度开始时缓存当前时间,以减少与时间相关的系统调用次数。
除非您的回调会阻塞事件循环较长时间,否则您通常不需要调用此函数,其中“较长时间”有点主观,但可能在一毫秒或更长时间的范围内。
返回值:无。
uv.walk({callback}) uv.walk()
参数
callback: callable
handle: uv_handle_t 子类型的 userdata
遍历句柄列表:callback 将对每个句柄执行。
返回值:无。
-- Example usage of uv.walk to close all handles that
-- aren't already closing.
uv.walk(function (handle)
  if not handle:is_closing() then
    handle:close()
  end
end)

uv_req_t — 基本请求 luv-base-request uv_req_t

uv_req_t 是所有 libuv 请求类型的基本类型。
uv.cancel({req}) uv.cancel()
> 方法形式 req:cancel()
参数
req: uv_req_t 子类型的 userdata
取消一个待处理的请求。如果请求正在执行或已完成执行,则失败。目前仅支持取消 uv_fs_tuv_getaddrinfo_tuv_getnameinfo_tuv_work_t 请求。
返回值:0fail
uv.req_get_type({req}) uv.req_get_type()
> 方法形式 req:get_type()
参数
req: uv_req_t 子类型的 userdata
返回给定请求的结构名称(例如,uv_fs_t"fs")和请求类型的 libuv 枚举整数(uv_req_type)。
返回值:string, integer

uv_handle_t — 基本句柄 luv-base-handle uv_handle_t

uv_handle_t 是所有 libuv 句柄类型的基本类型。此处定义的所有 API 函数都适用于任何句柄类型。
uv.is_active({handle}) uv.is_active()
> 方法形式 handle:is_active()
参数
handle: uv_handle_t 子类型的 userdata
如果句柄处于活动状态,则返回 true,如果句柄处于非活动状态,则返回 false。“活动”的含义取决于句柄的类型
uv_async_t 句柄始终处于活动状态,并且无法停用,除非通过 uv.close() 关闭它。
uv_pipe_tuv_tcp_tuv_udp_t 等句柄(基本上是处理 I/O 的任何句柄)在执行涉及 I/O 的操作(如读取、写入、连接、接受新连接等)时处于活动状态。
uv_check_tuv_idle_tuv_timer_t 等句柄在使用 uv.check_start()uv.idle_start()uv.timer_start() 等调用启动后处于活动状态,直到使用相应的停止函数调用停止它。
返回值:booleanfail
uv.is_closing({handle}) uv.is_closing()
> 方法形式 handle:is_closing()
参数
handle: uv_handle_t 子类型的 userdata
如果句柄正在关闭或已关闭,则返回 true,否则返回 false
返回值:booleanfail
注意: 此函数应该仅在句柄初始化和关闭回调到达之间使用。
uv.close({handle} [, {callback}]) uv.close()
> 方法形式 handle:close([callback])
参数
handle: uv_handle_t 子类型的 userdata
callback: callablenil
请求关闭句柄。callback 将在此调用之后异步调用。必须在释放内存之前对每个句柄调用此函数。
包装文件描述符的句柄会立即关闭,但 callback 仍将推迟到事件循环的下一次迭代。这为您提供了一个机会来释放与句柄关联的任何资源。
正在进行的请求(如 uv_connect_tuv_write_t)会被取消,它们的回调会异步调用 ECANCELED
返回值:无。
uv.ref({handle}) uv.ref()
> 方法形式 handle:ref()
参数
handle: uv_handle_t 子类型的 userdata
引用给定句柄。引用是幂等的,也就是说,如果句柄已经被引用,再次调用此函数将不会有任何效果。
返回值:无。
uv.unref({handle}) uv.unref()
> 方法形式 handle:unref()
参数
handle: uv_handle_t 子类型的 userdata
取消引用给定句柄。引用是幂等的,也就是说,如果句柄未被引用,再次调用此函数将不会有任何效果。
返回值:无。
uv.has_ref({handle}) uv.has_ref()
> 方法形式 handle:has_ref()
参数
handle: uv_handle_t 子类型的 userdata
如果句柄被引用,则返回 true,否则返回 false
返回值:booleanfail
uv.send_buffer_size({handle} [, {size}]) uv.send_buffer_size()
> 方法形式 handle:send_buffer_size([size])
参数
handle: uv_handle_t 子类型的 userdata
size: integernil(默认值:0
获取或设置操作系统为套接字使用的发送缓冲区的大小。
如果省略 size(或为 0),则将返回当前发送缓冲区大小;否则,将使用 size 设置新的发送缓冲区大小。
此函数适用于 Unix 上的 TCP、管道和 UDP 句柄,以及 Windows 上的 TCP 和 UDP 句柄。
返回值
integerfail(如果 sizenil0
0fail(如果 size 不为 nil 且不为 0
注意: Linux 将设置原始设置值的双倍大小并返回双倍大小。
uv.recv_buffer_size({handle} [, {size}]) uv.recv_buffer_size()
> 方法形式 handle:recv_buffer_size([size])
参数
handle: uv_handle_t 子类型的 userdata
size: integernil(默认值:0
获取或设置操作系统为套接字使用的接收缓冲区的大小。
如果省略 size(或为 0),则将返回当前发送缓冲区大小;否则,将使用 size 设置新的发送缓冲区大小。
此函数适用于 Unix 上的 TCP、管道和 UDP 句柄,以及 Windows 上的 TCP 和 UDP 句柄。
返回值
integerfail(如果 sizenil0
0fail(如果 size 不为 nil 且不为 0
注意: Linux 将设置原始设置值的双倍大小并返回双倍大小。
uv.fileno({handle}) uv.fileno()
> 方法形式 handle:fileno()
参数
handle: uv_handle_t 子类型的 userdata
获取平台相关的文件描述符等效项。
以下句柄受支持:TCP、管道、TTY、UDP 和轮询。传递任何其他句柄类型将以 EINVAL 失败。
如果句柄还没有附加的文件描述符或句柄本身已关闭,则此函数将返回 EBADF
返回值:integerfail
警告: 使用此函数时要非常小心。libuv 假设它控制文件描述符,因此对其进行的任何更改都可能导致故障。
uv.handle_get_type({handle}) uv.handle_get_type()
> 方法形式 handle:get_type()
参数
handle: uv_handle_t 子类型的 userdata
返回给定句柄的结构名称(例如,uv_pipe_t"pipe")和句柄类型的 libuv 枚举整数(uv_handle_type)。
返回值:string, integer
libuv 事件循环(如果在默认模式下运行)将一直运行,直到没有活动的引用句柄。用户可以通过取消引用活动的句柄来强制循环提前退出,例如,在调用 uv.timer_start() 后调用 uv.unref()
句柄可以被引用或取消引用,引用计数方案不使用计数器,因此这两个操作都是幂等的。
默认情况下,所有句柄在活动时都被引用,有关活动内容的更详细说明,请参阅 uv.is_active()

uv_timer_t — 定时器句柄 luv-timer-handle uv_timer_t

> uv_handle_t 函数也适用。
定时器句柄用于调度回调函数,以便在将来调用。
uv.new_timer() uv.new_timer()
创建并初始化一个新的 uv_timer_t。返回包装它的 Lua 用户数据。
返回:uv_timer_t 用户数据失败
-- Creating a simple setTimeout wrapper
local function setTimeout(timeout, callback)
  local timer = uv.new_timer()
  timer:start(timeout, 0, function ()
    timer:stop()
    timer:close()
    callback()
  end)
  return timer
end
-- Creating a simple setInterval wrapper
local function setInterval(interval, callback)
  local timer = uv.new_timer()
  timer:start(interval, interval, function ()
    callback()
  end)
  return timer
end
-- And clearInterval
local function clearInterval(timer)
  timer:stop()
  timer:close()
end
uv.timer_start({timer}, {timeout}, {repeat}, {callback}) uv.timer_start()
> 方法形式 timer:start(timeout, repeat, callback)
参数
timer: uv_timer_t 用户数据
timeout: 整数
repeat: 整数
callback: callable
启动定时器。timeoutrepeat 单位为毫秒。
如果 timeout 为零,则回调将在下一次事件循环迭代时触发。如果 repeat 非零,则回调将在 timeout 毫秒后首次触发,然后每隔 repeat 毫秒重复触发一次。
返回值:0fail
uv.timer_stop({timer}) uv.timer_stop()
> 方法形式 timer:stop()
参数
timer: uv_timer_t 用户数据
停止定时器,回调将不再被调用。
返回值:0fail
uv.timer_again({timer}) uv.timer_again()
> 方法形式 timer:again()
参数
timer: uv_timer_t 用户数据
停止定时器,如果它是重复的,则使用重复值作为超时重新启动它。如果定时器从未启动过,则会引发 EINVAL
返回值:0fail
uv.timer_set_repeat({timer}, {repeat}) uv.timer_set_repeat()
> 方法形式 timer:set_repeat(repeat)
参数
timer: uv_timer_t 用户数据
repeat: 整数
以毫秒为单位设置重复间隔值。定时器将被调度以在给定的间隔运行,而不管回调执行持续时间,并且在时间片超限的情况下将遵循正常的定时器语义。
例如,如果一个 50 毫秒的重复定时器首次运行了 17 毫秒,它将被调度在 33 毫秒后再次运行。如果其他任务在第一次定时器回调后消耗了超过 33 毫秒的时间,则回调将尽快运行。
返回值:无。
uv.timer_get_repeat({timer}) uv.timer_get_repeat()
> 方法形式 timer:get_repeat()
参数
timer: uv_timer_t 用户数据
获取定时器重复值。
返回:integer
uv.timer_get_due_in({timer}) uv.timer_get_due_in()
> 方法形式 timer:get_due_in()
参数
timer: uv_timer_t 用户数据
获取定时器到期值,如果已过期则为 0。时间相对于 uv.now()
返回:integer
注意: libuv 1.40.0 版本中的新增功能。

uv_prepare_t — 预备句柄 luv-prepare-handle uv_prepare_t

> uv_handle_t 函数也适用。
预备句柄将在每次循环迭代时运行给定的回调,在轮询 I/O 之前。
local prepare = uv.new_prepare()
prepare:start(function()
  print("Before I/O polling")
end)
uv.new_prepare() uv.new_prepare()
创建并初始化一个新的 uv_prepare_t。返回包装它的 Lua 用户数据。
返回:uv_prepare_t 用户数据
uv.prepare_start({prepare}, {callback}) uv.prepare_start()
> 方法形式 prepare:start(callback)
参数
prepare: uv_prepare_t 用户数据
callback: callable
使用给定的回调启动句柄。
返回值:0fail
uv.prepare_stop({prepare}) uv.prepare_stop()
> 方法形式 prepare:stop()
参数
prepare: uv_prepare_t 用户数据
停止句柄,回调将不再被调用。
返回值:0fail

uv_check_t — 检查句柄 luv-check-handle uv_check_t

> uv_handle_t 函数也适用。
检查句柄将在每次循环迭代时运行给定的回调,在轮询 I/O 之后。
local check = uv.new_check()
check:start(function()
  print("After I/O polling")
end)
uv.new_check() uv.new_check()
创建并初始化一个新的 uv_check_t。返回包装它的 Lua 用户数据。
返回:uv_check_t 用户数据
uv.check_start({check}, {callback}) uv.check_start()
> 方法形式 check:start(callback)
参数
check: uv_check_t 用户数据
callback: callable
使用给定的回调启动句柄。
返回值:0fail
uv.check_stop({check}) uv.check_stop()
> 方法形式 check:stop()
参数
check: uv_check_t 用户数据
停止句柄,回调将不再被调用。
返回值:0fail

uv_idle_t — 空闲句柄 luv-idle-handle uv_idle_t

> uv_handle_t 函数也适用。
空闲句柄将在每次循环迭代时运行给定的回调,在 uv_prepare_t 句柄之前。
注意: 与预备句柄的显着区别在于,当有活动空闲句柄时,循环将执行零超时轮询,而不是阻塞等待 I/O。
警告: 尽管名称如此,但空闲句柄会在每次循环迭代时调用其回调,而不会在循环实际“空闲”时调用。
local idle = uv.new_idle()
idle:start(function()
  print("Before I/O polling, no blocking")
end)
uv.new_idle() uv.new_idle()
创建并初始化一个新的 uv_idle_t。返回包装它的 Lua 用户数据。
返回:uv_idle_t 用户数据
uv.idle_start({idle}, {callback}) uv.idle_start()
> 方法形式 idle:start(callback)
参数
idle: uv_idle_t 用户数据
callback: callable
使用给定的回调启动句柄。
返回值:0fail
uv.idle_stop({check}) uv.idle_stop()
> 方法形式 idle:stop()
参数
idle: uv_idle_t 用户数据
停止句柄,回调将不再被调用。
返回值:0fail

uv_async_t — 异步句柄 luv-async-handle uv_async_t

> uv_handle_t 函数也适用。
异步句柄允许用户“唤醒”事件循环,并从另一个线程调用回调函数。
local async
async = uv.new_async(function()
  print("async operation ran")
  async:close()
end)
async:send()
uv.new_async({callback}) uv.new_async()
参数
callback: callable
...: threadargs 传递给/从 uv.async_send(async, ...)
创建并初始化一个新的 uv_async_t。返回包装它的 Lua 用户数据。
返回:uv_async_t 用户数据失败
注意: 与其他句柄初始化函数不同,此函数会立即启动句柄。
uv.async_send({async}, {...}) uv.async_send()
> 方法形式 async:send(...)
参数
async: uv_async_t 用户数据
...: threadargs
唤醒事件循环并调用异步句柄的回调函数。
返回值:0fail
注意: 从任何线程调用此函数都是安全的。回调将在循环线程上调用。
警告: libuv 将合并对 uv.async_send(async) 的调用,也就是说,并非每次调用它都会产生回调的执行。例如:如果在回调被调用之前连续调用了 5 次 uv.async_send(),则回调只会调用一次。如果在回调被调用后再次调用 uv.async_send(),则它将再次被调用。

uv_poll_t — 轮询句柄 luv-poll-handle uv_poll_t

> uv_handle_t 函数也适用。
轮询句柄用于监视文件描述符的可读性和可写性,类似于 poll(2) (https://linux.die.net/man/2/poll) 的用途。
轮询句柄的目的是启用集成依赖于事件循环以向其发出有关套接字状态更改信号的外部库,例如 c-ares 或 libssh2。不建议将 uv_poll_t 用于任何其他目的;uv_tcp_tuv_udp_t 等提供了比 uv_poll_t 可以实现的更快速、更可扩展的实现,尤其是在 Windows 上。
轮询句柄偶尔会发出信号,指示文件描述符是可读或可写,即使它不是。因此,用户应该始终做好准备,在尝试从 fd 读取或写入时处理 EAGAIN 或等效错误。
不允许为同一个套接字使用多个活动的轮询句柄,这会导致 libuv 忙循环或其他故障。
用户不应该在活动轮询句柄轮询文件描述符时关闭它。这会导致句柄报告错误,但也可能开始轮询另一个套接字。但是,可以在调用 uv.poll_stop()uv.close() 之后立即安全地关闭 fd。
注意: 在 Windows 上,只有套接字可以用轮询句柄轮询。在 Unix 上,可以接受 poll(2) 的任何文件描述符。
uv.new_poll({fd}) uv.new_poll()
参数
fd: 整数
使用文件描述符初始化句柄。
文件描述符设置为非阻塞模式。
返回:uv_poll_t 用户数据失败
uv.new_socket_poll({fd}) uv.new_socket_poll()
参数
fd: 整数
使用套接字描述符初始化句柄。在 Unix 上,这与 uv.new_poll() 相同。在 Windows 上,它接受 SOCKET 句柄。
套接字设置为非阻塞模式。
返回:uv_poll_t 用户数据失败
uv.poll_start({poll}, {events}, {callback}) uv.poll_start()
> 方法形式 poll:start(events, callback)
参数
poll: uv_poll_t 用户数据
events: 字符串nil(默认值:"rw"
callback: callable
err: nil字符串
events: 字符串nil
开始轮询文件描述符。events 为:"r""w""rw""d""rd""wd""rwd""p""rp""wp""rwp""dp""rdp""wdp""rwdp",其中 rREADABLEwWRITABLEdDISCONNECTpPRIORITIZED。一旦检测到事件,回调将被调用,状态设置为 0,事件字段上将设置检测到的事件。
用户不应该在句柄处于活动状态时关闭套接字。如果用户无论如何都这样做,回调可能会被调用并报告错误状态,但这并不保证。
返回值:0fail
注意 对处于活动状态的句柄调用 uv.poll_start() 是可以的。这样做将更新正在监视的事件掩码。
uv.poll_stop({poll}) uv.poll_stop()
> 方法形式 poll:stop()
参数
poll: uv_poll_t 用户数据
停止轮询文件描述符,回调将不再被调用。
返回值:0fail

uv_signal_t — 信号句柄 luv-signal-handle uv_signal_t

> uv_handle_t 函数也适用。
信号句柄在每个事件循环的基础上实现类 Unix 信号处理。
Windows 说明:
在 Windows 上模拟接收某些信号
当用户按下 CTRL+C 时,通常会传递 SIGINT。但是,与 Unix 一样,当启用终端原始模式时,它不会生成。
当用户按下 CTRL + BREAK 时,会传递 SIGBREAK。
当用户关闭控制台窗口时,会生成 SIGHUP。在 SIGHUP 时,程序大约有 10 秒的时间来执行清理。之后,Windows 将无条件地终止它。
每当 libuv 检测到控制台已调整大小,就会引发 SIGWINCH。当程序使用 uv_tty_t 句柄写入控制台时,libuv 会模拟 SIGWINCH。SIGWINCH 可能不会始终及时传递;libuv 仅在移动光标时才会检测到大小更改。当在原始模式下使用可读的 uv_tty_t 句柄时,调整控制台缓冲区也会触发 SIGWINCH 信号。
可以成功创建其他信号的观察者,但这些信号永远不会收到。这些信号是:SIGILL、SIGABRT、SIGFPE、SIGSEGV、SIGTERM 和 SIGKILL。
libuv 检测不到调用 raise() 或 abort() 以编程方式引发信号;这些不会触发信号观察者。
Unix 说明:
SIGKILL 和 SIGSTOP 无法捕获。
通过 libuv 处理 SIGBUS、SIGFPE、SIGILL 或 SIGSEGV 会导致未定义的行为。
如果由 abort() 生成,例如通过 assert(),SIGABRT 将不会被 libuv 捕获。
在 Linux 上,NPTL pthreads 库使用 SIGRT0 和 SIGRT1(信号 32 和 33)来管理线程。为这些信号安装观察者会导致不可预测的行为,强烈建议不要这样做。将来版本的 libuv 可能直接拒绝它们。
-- Create a new signal handler
local signal = uv.new_signal()
-- Define a handler function
uv.signal_start(signal, "sigint", function(signal)
  print("got " .. signal .. ", shutting down")
  os.exit(1)
end)
uv.new_signal() uv.new_signal()
创建并初始化一个新的 uv_signal_t。返回包装它的 Lua 用户数据。
返回:uv_signal_t 用户数据失败
uv.signal_start({信号}, {信号}, {回调}) uv.signal_start()
> 方法形式 信号:开始(信号, 回调)
参数
信号uv_signal_t 用户数据
信号整数字符串
callback: callable
信号字符串
使用给定的回调启动句柄,观察给定的信号。
返回:0失败 uv.signal_start_oneshot()
uv.signal_start_oneshot({信号}, {信号}, {回调})
> 方法形式 信号:开始一次(信号, 回调)
参数
信号uv_signal_t 用户数据
信号整数字符串
callback: callable
信号字符串
uv.signal_start() 相同的功能,但信号处理程序在收到信号的瞬间重置。
返回值:0fail
uv.signal_stop({信号}) uv.signal_stop()
> 方法形式 信号:停止()
参数
信号uv_signal_t 用户数据
停止句柄,回调将不再被调用。
返回值:0fail

uv_process_t — 进程句柄 luv-process-handle uv_process_t

> uv_handle_t 函数也适用。
进程句柄将生成一个新进程,并允许用户控制它并使用流与它建立通信通道。
uv.disable_stdio_inheritance() uv.disable_stdio_inheritance()
禁用此进程从其父进程继承的文件描述符/句柄。其效果是,由该进程生成的子进程不会意外地继承这些句柄。
建议在程序中尽可能早地调用此函数,在继承的文件描述符被关闭或复制之前。
返回值:无。
注意:此函数基于尽力而为的基础工作:不能保证 libuv 可以发现所有继承的文件描述符。总的来说,它在 Windows 上比在 Unix 上做得更好。
uv.spawn({路径}, {选项}, {退出时}) uv.spawn()
参数
路径字符串
选项(见下文)
退出时可调用
代码整数
信号整数
初始化进程句柄并启动进程。如果进程成功生成,则此函数将返回句柄和子进程的 pid。
无法生成的可能原因包括(但不限于)要执行的文件不存在、没有权限使用指定的 setuid 或 setgid,或者没有足够的内存来分配新进程。
local stdin = uv.new_pipe()
local stdout = uv.new_pipe()
local stderr = uv.new_pipe()
print("stdin", stdin)
print("stdout", stdout)
print("stderr", stderr)
local handle, pid = uv.spawn("cat", {
  stdio = {stdin, stdout, stderr}
}, function(code, signal) -- on exit
  print("exit code", code)
  print("exit signal", signal)
end)
print("process opened", handle, pid)
uv.read_start(stdout, function(err, data)
  assert(not err, err)
  if data then
    print("stdout chunk", stdout, data)
  else
    print("stdout end", stdout)
  end
end)
uv.read_start(stderr, function(err, data)
  assert(not err, err)
  if data then
    print("stderr chunk", stderr, data)
  else
    print("stderr end", stderr)
  end
end)
uv.write(stdin, "Hello World")
uv.shutdown(stdin, function()
  print("stdin shutdown", stdin)
  uv.close(handle, function()
    print("process closed", handle, pid)
  end)
end)
uv.spawn-选项
选项 表接受以下字段
options.args - 命令行参数作为字符串列表。第一个字符串不应是程序的路径,因为这已通过 路径 提供。在 Windows 上,这使用 CreateProcess 将参数连接到字符串中。这可能会导致一些奇怪的错误(有关 Windows 的详细信息,请参见 options.verbatim)。
options.stdio - 设置将提供给子进程的文件描述符。惯例是前几个条目是 stdin、stdout 和 stderr。(注意:在 Windows 上,只有当子进程使用 MSVCRT 运行时,第三个条目之后的文件描述符才对子进程可用。)
options.env - 为新进程设置环境变量。
options.cwd - 为子进程设置当前工作目录。
options.uid - 设置子进程的用户 ID。
options.gid - 设置子进程的组 ID。
options.verbatim - 如果为真,则在将参数列表转换为命令行字符串时,不要将任何参数包装在引号中,也不执行任何其他转义。此选项仅在 Windows 系统上有意义。在 Unix 上,它被静默忽略。
options.detached - 如果为真,则以分离状态生成子进程 - 这将使其成为进程组组长,并且实际上将使子进程在父进程退出后继续运行。请注意,除非父进程在子进程的进程句柄上调用 uv.unref(),否则子进程仍将使父进程的事件循环保持活动状态。
options.hide - 如果为真,则隐藏通常创建的子进程控制台窗口。此选项仅在 Windows 系统上有意义。在 Unix 上,它被静默忽略。
options.stdio 条目可以采用多种形式。
如果它们是数字,则子进程从父进程继承相同索引为零的 fd。
如果传递了 uv_stream_t 句柄,则根据流是否具有有效的 fd,它们用作读写管道或继承的流。
包括 nil 占位符意味着在子进程中忽略该 fd。
当子进程退出时,将使用退出代码和信号调用 退出时
返回:uv_process_t 用户数据, 整数
uv.process_kill({进程}, {信号}) uv.process_kill()
> 方法形式 进程:杀死(信号)
参数
进程uv_process_t 用户数据
信号整数字符串nil(默认:sigterm
将指定的信号发送到给定的进程句柄。检查 uv_signal_t 上的文档以了解信号支持,尤其是在 Windows 上。
返回值:0fail
uv.kill({pid}, {信号}) uv.kill()
参数
pid整数
信号整数字符串nil(默认:sigterm
将指定的信号发送到给定的 PID。检查 uv_signal_t 上的文档以了解信号支持,尤其是在 Windows 上。
返回值:0fail
uv.process_get_pid({进程}) uv.process_get_pid()
> 方法形式 进程:获取_pid()
参数
进程uv_process_t 用户数据
返回句柄的 pid。
返回:integer

uv_stream_t — 流句柄 luv-stream-handle uv_stream_t

> uv_handle_t 函数也适用。
流句柄提供了双工通信通道的抽象。uv_stream_t 是一种抽象类型,libuv 以 uv_tcp_tuv_pipe_tuv_tty_t 的形式提供了 3 种流实现。
uv.shutdown({流} [, {回调}]) uv.shutdown()
> 方法形式 流:关闭([回调])
参数
uv_stream_t 的子类型的 用户数据
callback: callablenil
err: nil字符串
关闭双工流的传出(写入)端。它等待挂起的写入请求完成。关闭完成后,将调用回调。
返回:uv_shutdown_t 用户数据失败
uv.listen({流}, {待处理}, {回调}) uv.listen()
> 方法形式 流:监听(待处理, 回调)
参数
uv_stream_t 的子类型的 用户数据
待处理整数
callback: callable
err: nil字符串
开始监听传入的连接。待处理 指示内核可能排队的连接数,与 listen(2) 相同。收到新的传入连接时,将调用回调。
返回值:0fail
uv.accept({流}, {客户端流}) uv.accept()
> 方法形式 流:接受(客户端流)
参数
uv_stream_t 的子类型的 用户数据
客户端流uv_stream_t 的子类型的 用户数据
此调用与 uv.listen() 一起使用,用于接受传入的连接。收到回调后调用此函数以接受连接。
当连接回调被调用时,保证此函数在第一次成功完成。如果你尝试多次使用它,它可能会失败。建议每个连接调用只调用此函数一次。
返回值:0fail
server:listen(128, function (err)
  local client = uv.new_tcp()
  server:accept(client)
end)
uv.read_start({流}, {回调}) uv.read_start()
> 方法形式 流:读开始(回调)
参数
uv_stream_t 的子类型的 用户数据
callback: callable
err: nil字符串
数据字符串nil
从传入的流中读取数据。回调将多次进行,直到没有更多数据可读或调用 uv.read_stop()。当我们到达 EOF 时,数据 将为 nil
返回值:0fail
stream:read_start(function (err, chunk)
  if err then
    -- handle read error
  elseif chunk then
    -- handle data
  else
    -- handle disconnect
  end
end)
uv.read_stop({流}) uv.read_stop()
> 方法形式 流:读停止()
参数
uv_stream_t 的子类型的 用户数据
停止从流中读取数据。读回调将不再被调用。
此函数是幂等的,可以在停止的流上安全地调用。
返回值:0fail
uv.write({流}, {数据} [, {回调}]) uv.write()
> 方法形式 流:写入(数据, [回调])
参数
uv_stream_t 的子类型的 用户数据
数据缓冲区
callback: callablenil
err: nil字符串
将数据写入流。
数据 可以是 Lua 字符串或字符串表。如果传递了表,则 C 后端将使用 writev 在单个系统调用中发送所有字符串。
可选的 回调 用于了解写入何时完成。
返回:uv_write_t 用户数据失败
uv.write2({流}, {数据}, {发送句柄} [, {回调}]) uv.write2()
> 方法形式 流:写入2(数据, 发送句柄, [回调])
参数
uv_stream_t 的子类型的 用户数据
数据缓冲区
发送句柄uv_stream_t 的子类型的 用户数据
callback: callablenil
err: nil字符串
用于通过管道发送句柄的扩展写入函数。管道必须使用 ipc 选项 true 初始化。
返回:uv_write_t 用户数据失败
注意:发送句柄 必须是 TCP 套接字或管道,它是服务器或连接(侦听或已连接状态)。绑定套接字或管道将被认为是服务器。
uv.try_write({流}, {数据}) uv.try_write()
> 方法形式 stream:try_write(data)
参数
uv_stream_t 的子类型的 用户数据
数据缓冲区
uv.write() 相同,但如果无法立即完成写入请求,则不会排队写入请求。
将返回写入的字节数(可能小于提供的缓冲区大小)。
返回值:integerfail
uv.try_write2({stream}, {data}, {send_handle}) uv.try_write2()
> 方法形式 stream:try_write2(data, send_handle)
参数
uv_stream_t 的子类型的 用户数据
数据缓冲区
发送句柄uv_stream_t 的子类型的 用户数据
类似于 uv.write2(),但具有 uv.try_write() 的属性。在 Windows 上不支持,它将返回 UV_EAGAIN
将返回写入的字节数(可能小于提供的缓冲区大小)。
返回值:integerfail
uv.is_readable({stream}) uv.is_readable()
> 方法形式 stream:is_readable()
参数
uv_stream_t 的子类型的 用户数据
如果流可读,则返回 true,否则返回 false
返回值:boolean
uv.is_writable({stream}) uv.is_writable()
> 方法形式 stream:is_writable()
参数
uv_stream_t 的子类型的 用户数据
如果流可写,则返回 true,否则返回 false
返回值:boolean
uv.stream_set_blocking({stream}, {blocking}) uv.stream_set_blocking()
> 方法形式 stream:set_blocking(blocking)
参数
uv_stream_t 的子类型的 用户数据
blocking: boolean
启用或禁用流的阻塞模式。
当启用阻塞模式时,所有写入都将同步完成。否则接口保持不变,例如,操作完成或失败仍将通过异步执行的回调报告。
返回值:0fail
警告:不建议过度依赖此 API。它将来可能会发生重大变化。目前这仅适用于 Windows,仅适用于 uv_pipe_t 处理程序。此外,libuv 目前在写入请求已提交后更改阻塞模式时不保证顺序。因此,建议在打开或创建流后立即设置阻塞模式。
uv.stream_get_write_queue_size() uv.stream_get_write_queue_size()
> 方法形式 stream:get_write_queue_size()
返回流的写入队列大小。
返回:integer

uv_tcp_t — TCP 处理程序 luv-tcp-handle uv_tcp_t

> uv_handle_tuv_stream_t 函数也适用。
TCP 处理程序用于表示 TCP 流和服务器。
uv.new_tcp([{flags}]) uv.new_tcp()
参数
flags: stringnil
创建并初始化一个新的 uv_tcp_t。返回包装它的 Lua 用户数据。标志可以是族字符串:"unix""inet""inet6""ipx""netlink""x25""ax25""atmpvc""appletalk""packet"
返回值:uv_tcp_t 用户数据失败
uv.tcp_open({tcp}, {sock}) uv.tcp_open()
> 方法形式 tcp:open(sock)
参数
tcp: uv_tcp_t 用户数据
sock: integer
将现有文件描述符或 SOCKET 打开为 TCP 处理程序。
返回值:0fail
注意:传递的文件描述符或 SOCKET 未检查其类型,但要求它表示有效的流套接字。
uv.tcp_nodelay({tcp}, {enable}) uv.tcp_nodelay()
> 方法形式 tcp:nodelay(enable)
参数
tcp: uv_tcp_t 用户数据
enable: boolean
启用/禁用 Nagle 算法。
返回值:0fail
uv.tcp_keepalive({tcp}, {enable} [, {delay}]) uv.tcp_keepalive()
> 方法形式 tcp:keepalive(enable, [delay])
参数
tcp: uv_tcp_t 用户数据
enable: boolean
delay: integernil
启用/禁用 TCP 保持活动。delay 是以秒为单位的初始延迟,当 enable 为 false 时忽略。
返回值:0fail
uv.tcp_simultaneous_accepts({tcp}, {enable}) uv.tcp_simultaneous_accepts()
> 方法形式 tcp:simultaneous_accepts(enable)
参数
tcp: uv_tcp_t 用户数据
enable: boolean
启用/禁用当监听新的 TCP 连接时由操作系统排队的同步异步接受请求。
此设置用于调整 TCP 服务器以获得所需的性能。同时接受可以显着提高接受连接的速度(这就是默认情况下启用它的原因),但可能会导致多进程设置中负载分布不均匀。
返回值:0fail
uv.tcp_bind({tcp}, {host}, {port} [, {flags}]) uv.tcp_bind()
> 方法形式 tcp:bind(host, port, [flags])
参数
tcp: uv_tcp_t 用户数据
host: string
port: integer
flags: tablenil
ipv6only: boolean
将句柄绑定到主机和端口。host 应为 IP 地址,而不是域名。任何 flags 都是使用表设置的,该表具有等于 truefalse 的字段 ipv6only
当端口已被占用时,您可能会看到来自 uv.tcp_bind()uv.listen()uv.tcp_connect()EADDRINUSE 错误。也就是说,成功调用此函数并不能保证对 uv.listen()uv.tcp_connect() 的调用也会成功。
使用端口 0 让操作系统分配一个短暂端口。您可以在以后使用 uv.tcp_getsockname() 查看它。
返回值:0fail
uv.tcp_getpeername({tcp}) uv.tcp_getpeername()
> 方法形式 tcp:getpeername()
参数
tcp: uv_tcp_t 用户数据
获取与句柄连接的同级地址。
返回值:table失败
ip : string
family : string
port : integer
uv.tcp_getsockname({tcp}) uv.tcp_getsockname()
> 方法形式 tcp:getsockname()
参数
tcp: uv_tcp_t 用户数据
获取句柄绑定的当前地址。
返回值:table失败
ip : string
family : string
port : integer
uv.tcp_connect({tcp}, {host}, {port}, {callback}) uv.tcp_connect()
> 方法形式 tcp:connect(host, port, callback)
参数
tcp: uv_tcp_t 用户数据
host: string
port: integer
callback: callable
err: nil字符串
建立 IPv4 或 IPv6 TCP 连接。
返回值:uv_connect_t 用户数据失败
local client = uv.new_tcp()
client:connect("127.0.0.1", 8080, function (err)
  -- check error and carry on.
end)
uv.tcp_write_queue_size({tcp}) uv.tcp_write_queue_size()
> 方法形式 tcp:write_queue_size()
已弃用:请改用 uv.stream_get_write_queue_size()
uv.tcp_close_reset([{callback}]) uv.tcp_close_reset()
> 方法形式 tcp:close_reset([callback])
参数
tcp: uv_tcp_t 用户数据
callback: callablenil
通过发送 RST 数据包重置 TCP 连接。这是通过将 SO_LINGER 套接字选项设置为零的保持时间间隔,然后调用 uv.close() 来实现的。由于某些平台不一致,不允许混合使用 uv.shutdown()uv.tcp_close_reset() 调用。
返回值:0失败 uv.socketpair()
uv.socketpair([{socktype}, [{protocol}, [{flags1}, [{flags2}]]]])
参数
socktype: stringintegernil(默认值:stream
protocol: stringintegernil(默认值:0)
flags1: tablenil
nonblock: boolean(默认值:false
flags2: tablenil
nonblock: boolean(默认值:false
使用指定属性创建一对连接的套接字。生成的句柄可以传递给 uv.tcp_open(),与 uv.spawn() 一起使用,或用于任何其他目的。
当指定为字符串时,socktype 必须是 "stream""dgram""raw""rdm""seqpacket" 中的一个。
protocol 设置为 0 或 nil 时,它将根据套接字的域和类型自动选择。当 protocol 指定为字符串时,它将使用 getprotobyname(3) 函数查找(例如:"ip""icmp""tcp""udp" 等)。
标志
nonblock: 为 OVERLAPPEDFIONBIO/`O_NONBLOCK` I/O 使用打开指定的套接字句柄。这对于将由 libuv 使用的句柄来说是推荐的,否则通常不建议这样做。
等效于域为 AF_UNIXsocketpair(2)
返回值:table失败
[1, 2] : integer(文件描述符)
-- Simple read/write with tcp
local fds = uv.socketpair(nil, nil, {nonblock=true}, {nonblock=true})
local sock1 = uv.new_tcp()
sock1:open(fds[1])
local sock2 = uv.new_tcp()
sock2:open(fds[2])
sock1:write("hello")
sock2:read_start(function(err, chunk)
  assert(not err, err)
  print(chunk)
end)

uv_pipe_t — 管道处理程序 luv-pipe-handle uv_pipe_t

> uv_handle_tuv_stream_t 函数也适用。
管道处理程序在 Unix 上的本地域套接字和 Windows 上的命名管道上提供抽象。
local pipe = uv.new_pipe(false)
pipe:bind('/tmp/sock.test')
pipe:listen(128, function()
  local client = uv.new_pipe(false)
  pipe:accept(client)
  client:write("hello!\n")
  client:close()
end)
uv.new_pipe([{ipc}]) uv.new_pipe()
参数
ipc: booleannil(默认值:false
创建并初始化一个新的 uv_pipe_t。返回包装它的 Lua 用户数据。ipc 参数是一个布尔值,指示此管道是否将用于进程之间的句柄传递。
返回值:uv_pipe_t 用户数据失败
uv.pipe_open({pipe}, {fd}) uv.pipe_open()
> 方法形式 pipe:open(fd)
参数
pipe: uv_pipe_t 用户数据
fd: 整数
将现有文件描述符或 uv_handle_t 打开为管道。
返回值:0fail
注意:文件描述符设置为非阻塞模式。
uv.pipe_bind({pipe}, {name}) uv.pipe_bind()
> 方法形式 pipe:bind(name)
参数
pipe: uv_pipe_t 用户数据
name: string
将管道绑定到文件路径(Unix)或名称(Windows)。
返回值:0fail
注意:Unix 上的路径将被截断为 sizeof(sockaddr_un.sun_path) 字节,通常在 92 到 108 字节之间。
uv.pipe_connect({pipe}, {name} [, {callback}]) uv.pipe_connect()
> 方法形式 pipe:connect(name, [callback])
参数
pipe: uv_pipe_t 用户数据
name: string
callback: callablenil
err: nil字符串
连接到 Unix 域套接字或命名管道。
返回值:uv_connect_t 用户数据失败
注意:Unix 上的路径将被截断为 sizeof(sockaddr_un.sun_path) 字节,通常在 92 到 108 字节之间。
uv.pipe_getsockname({pipe}) uv.pipe_getsockname()
> 方法形式 pipe:getsockname()
参数
pipe: uv_pipe_t 用户数据
获取 Unix 域套接字或命名管道的名称。
返回值:string失败
uv.pipe_getpeername({pipe}) uv.pipe_getpeername()
> 方法形式 pipe:getpeername()
参数
pipe: uv_pipe_t 用户数据
获取句柄连接到的 Unix 域套接字或命名管道的名称。
返回值:string失败
uv.pipe_pending_instances({pipe}, {count}) uv.pipe_pending_instances()
> 方法形式 pipe:pending_instances(count)
参数
pipe: uv_pipe_t 用户数据
count: integer
设置管道服务器等待连接时挂起的管道实例句柄数量。
返回值:无。
注意:此设置仅适用于 Windows。
uv.pipe_pending_count({pipe}) uv.pipe_pending_count()
> 方法形式 pipe:pending_count()
参数
pipe: uv_pipe_t 用户数据
返回命名管道的挂起管道计数。
返回:integer
uv.pipe_pending_type({pipe}) uv.pipe_pending_type()
> 方法形式 pipe:pending_type()
参数
pipe: uv_pipe_t 用户数据
用于通过 IPC 管道接收句柄。
第一步 - 调用 uv.pipe_pending_count(),如果返回值 > 0,则使用 uv.pipe_pending_type() 返回的类型初始化一个句柄,并调用 uv.accept(pipe, handle)
返回:string
uv.pipe_chmod({pipe}, {flags}) uv.pipe_chmod()
> 方法形式 pipe:chmod(flags)
参数
pipe: uv_pipe_t 用户数据
flags: string
更改管道权限,允许不同用户运行的进程访问。使管道对所有用户可写或可读。flags 可以是:"r""w""rw""wr",其中 r 代表 READABLEw 代表 WRITABLE。此函数为阻塞函数。
返回值:0fail
uv.pipe({read_flags}, {write_flags}) uv.pipe()
参数
read_flags: tablenil
nonblock: boolean(默认值:false
write_flags: tablenil
nonblock: boolean(默认值:false
创建一对连接的管道句柄。数据可以写入 write fd 并从 read fd 读取。生成的句柄可以传递给 pipe_open,与 spawn 一起使用,或用于任何其他目的。
标志
nonblock: 为 OVERLAPPEDFIONBIO/`O_NONBLOCK` I/O 使用打开指定的套接字句柄。这对于将由 libuv 使用的句柄来说是推荐的,否则通常不建议这样做。
等效于设置了 O_CLOEXEC 标志的 pipe(2)
返回值:table失败
read : integer (文件描述符)
write : integer (文件描述符)
-- Simple read/write with pipe_open
local fds = uv.pipe({nonblock=true}, {nonblock=true})
local read_pipe = uv.new_pipe()
read_pipe:open(fds.read)
local write_pipe = uv.new_pipe()
write_pipe:open(fds.write)
write_pipe:write("hello")
read_pipe:read_start(function(err, chunk)
  assert(not err, err)
  print(chunk)
end)
uv.pipe_bind2({pipe}, {name}, {flags}) uv.pipe_bind2()
> 方法形式 pipe:pipe_bind(name, flags)
参数
pipe: uv_pipe_t 用户数据
name: string
flags: integertablenil (默认值:0)
标志
如果 type(flags)number,则它必须为 0uv.constants.PIPE_NO_TRUNCATE
如果 type(flags)table,则它必须为 {}{ no_truncate = true|false }
如果 type(flags)nil,则使用默认值 0
对于不支持的标志,在执行绑定之前返回 EINVAL
将管道绑定到文件路径(Unix)或名称(Windows)。
支持 Linux 抽象命名空间套接字。namelen 必须包含前导的 '\0' 字节,但不包含尾部的空字节。
返回值:0fail
注意: 1. Unix 上的路径会被截断为 sizeof(sockaddr_un.sun_path) 字节,通常在 92 到 108 字节之间。 2. 版本 1.46.0 中的新功能。
uv.pipe_connect2(pipe, name, [flags], [callback]) uv.pipe_connect2()
> 方法形式 pipe:connect2(name, [flags], [callback])
参数
pipe: uv_pipe_t 用户数据
name: string
flags: integertablenil (默认值:0)
callback: callablenil
err: nil字符串
标志:
如果 type(flags)number,则它必须为 0uv.constants.PIPE_NO_TRUNCATE
如果 type(flags)table,则它必须为 {}{ no_truncate = true|false }
如果 type(flags)nil,则使用默认值 0
对于不支持的标志,在执行绑定操作之前返回 EINVAL
连接到 Unix 域套接字或命名管道。
支持 Linux 抽象命名空间套接字。namelen 必须包含前导的空字节,但不包含尾部的空字节。
返回值:uv_connect_t 用户数据失败
注意: 1. Unix 上的路径会被截断为 sizeof(sockaddr_un.sun_path) 字节,通常在 92 到 108 字节之间。 2. 版本 1.46.0 中的新功能。

uv_tty_t — TTY 句柄 luv-tty-handle uv_tty_t

> uv_handle_tuv_stream_t 函数也适用。
TTY 句柄表示控制台的流。
-- Simple echo program
local stdin = uv.new_tty(0, true)
local stdout = uv.new_tty(1, false)
stdin:read_start(function (err, data)
  assert(not err, err)
  if data then
    stdout:write(data)
  else
    stdin:close()
    stdout:close()
  end
end)
uv.new_tty({fd}, {readable}) uv.new_tty()
参数
fd: 整数
readable: boolean
使用给定的文件描述符初始化一个新的 TTY 流。通常文件描述符将是
0 - stdin
1 - stdout
2 - stderr
在 Unix 上,此函数将使用 ttyname_r(3) 确定终端 fd 的路径,打开它,并在传递的文件描述符引用 TTY 时使用它。这使得 libuv 可以将 tty 设置为非阻塞模式,而不会影响共享 tty 的其他进程。
在不支持 ioctl TIOCGPTN 或 TIOCPTYGNAME 的系统上(例如 OpenBSD 和 Solaris),此函数不是线程安全的。
返回:uv_tty_t userdatafail
注意:如果重新打开 TTY 失败,libuv 会退回到阻塞写入。
uv.tty_set_mode({tty}, {mode}) uv.tty_set_mode()
> 方法形式 tty:set_mode(mode)
参数
tty: uv_tty_t userdata
mode: integer
使用指定的终端模式设置 TTY。
参数 mode 是一个 C 枚举,具有以下值
0 - UV_TTY_MODE_NORMAL: 初始/正常终端模式
1 - UV_TTY_MODE_RAW: 原始输入模式(在 Windows 上,还启用 ENABLE_WINDOW_INPUT)
2 - UV_TTY_MODE_IO: 用于 IPC 的二进制安全 I/O 模式(仅限 Unix)
返回值:0fail
uv.tty_reset_mode() uv.tty_reset_mode()
在程序退出时调用。将 TTY 设置重置为下一个进程接管的默认值。
此函数在 Unix 平台上是异步信号安全的,但如果在 uv.tty_set_mode() 内部执行时调用它,则可能会因错误代码 EBUSY 而失败。
返回值:0fail
uv.tty_get_winsize({tty}) uv.tty_get_winsize()
> 方法形式 tty:get_winsize()
参数
tty: uv_tty_t userdata
获取当前窗口宽度和高度。
返回:integer, integerfail
uv.tty_set_vterm_state({state}) uv.tty_set_vterm_state()
参数
state: string
控制 libuv 或控制台是否处理控制台虚拟终端序列。这在特别情况下对启用 ConEmu 对 ANSI X3.64 和 Xterm 256 色的支持很有用。否则,通常会自动检测 Windows10 控制台。状态应为以下之一:"supported""unsupported"
此函数仅在 Windows 系统上有意义。在 Unix 上,它会被静默忽略。
返回:无
uv.tty_get_vterm_state() uv.tty_get_vterm_state()
获取控制台虚拟终端序列是否由 libuv 或控制台处理的当前状态。返回值为 "supported""unsupported"
此函数在 Unix 上未实现,它将返回 ENOTSUP
返回值:string失败

uv_udp_t — UDP 句柄 luv-udp-handle uv_udp_t

> uv_handle_t 函数也适用。
UDP 句柄封装了 UDP 客户端和服务器的通信。
uv.new_udp([{flags}]) uv.new_udp()
参数
flags: tablenil
family: stringnil
mmsgs: integernil (默认值:1)
创建并初始化一个新的 uv_udp_t。返回包装它的 Lua 用户数据。实际的套接字是懒惰创建的。
如果指定,family 必须是以下之一:"unix""inet""inet6""ipx""netlink""x25""ax25""atmpvc""appletalk""packet"
如果指定,mmsgs 确定可以通过 recvmmsg(2) 接收的消息数量(分配的缓冲区大小将能够容纳指定数量的最大大小数据报)。只对支持 recvmmsg(2) 的平台有效。
注意:出于向后兼容性的原因,flags 也可以是字符串或整数。当它是一个字符串时,它将被视为上面的 family 键。当它是一个整数时,它将直接用作调用 uv_udp_init_ex 时的 flags 参数。
返回:uv_udp_t userdatafail
uv.udp_get_send_queue_size() uv.udp_get_send_queue_size()
> 方法形式 udp:get_send_queue_size()
返回句柄的发送队列大小。
返回:integer
uv.udp_get_send_queue_count() uv.udp_get_send_queue_count()
> 方法形式 udp:get_send_queue_count()
返回句柄的发送队列计数。
返回:integer
uv.udp_open({udp}, {fd}) uv.udp_open()
> 方法形式 udp:open(fd)
参数
udp: uv_udp_t userdata
fd: 整数
将现有文件描述符或 Windows SOCKET 打开为 UDP 句柄。
仅限 Unix:sock 参数的唯一要求是它遵循数据报协议(在非连接模式下工作,支持 sendmsg()/recvmsg() 等)。换句话说,其他数据报类型套接字(如原始套接字或 netlink 套接字)也可以传递给此函数。
文件描述符设置为非阻塞模式。
注意:传递的文件描述符或 SOCKET 不会检查其类型,但要求它代表一个有效的数据报套接字。
返回值:0fail
uv.udp_bind({udp}, {host}, {port} [, {flags}]) uv.udp_bind()
> 方法形式 udp:bind(host, port, [flags])
参数
udp: uv_udp_t userdata
host: string
port: number
flags: tablenil
ipv6only: boolean
reuseaddr: boolean
将 UDP 句柄绑定到 IP 地址和端口。任何 flags 都使用包含字段 reuseaddripv6only 等于 truefalse 的表设置。
返回值:0fail
uv.udp_getsockname({udp}) uv.udp_getsockname()
> 方法形式 udp:getsockname()
参数
udp: uv_udp_t userdata
获取 UDP 句柄的本地 IP 和端口。
返回值:table失败
ip : string
family : string
port : integer
uv.udp_getpeername({udp}) uv.udp_getpeername()
> 方法形式 udp:getpeername()
参数
udp: uv_udp_t userdata
获取连接的 UDP 句柄上的远程 IP 和端口。
返回值:table失败
ip : string
family : string
port : integer
uv.udp_set_membership()
uv.udp_set_membership({udp}, {multicast_addr}, {interface_addr}, {membership})
> 方法形式 > udp:set_membership(multicast_addr, interface_addr, membership)
参数
udp: uv_udp_t userdata
multicast_addr: string
interface_addr: stringnil
membership: string
设置多播地址的成员资格。multicast_addr 是要设置成员资格的多播地址。interface_addr 是接口地址。membership 可以是字符串 "leave""join"
返回值:0fail
uv.udp_set_source_membership()
uv.udp_set_source_membership({udp}, {multicast_addr}, {interface_addr}, {source_addr}, {membership})
> 方法形式 > udp:set_source_membership(multicast_addr, interface_addr, source_addr, membership)
参数
udp: uv_udp_t userdata
multicast_addr: string
interface_addr: stringnil
source_addr: string
membership: string
设置源特定多播组的成员资格。multicast_addr 是要设置成员资格的多播地址。interface_addr 是接口地址。source_addr 是源地址。membership 可以是字符串 "leave""join"
返回值:0fail
uv.udp_set_multicast_loop({udp}, {on}) uv.udp_set_multicast_loop()
> 方法形式 udp:set_multicast_loop(on)
参数
udp: uv_udp_t userdata
on: boolean
设置 IP 多播循环标志。使多播数据包循环回本地套接字。
返回值:0fail
uv.udp_set_multicast_ttl({udp}, {ttl}) uv.udp_set_multicast_ttl()
> 方法形式 udp:set_multicast_ttl(ttl)
参数
udp: uv_udp_t userdata
ttl: integer
设置多播 ttl。
ttl 是 1 到 255 之间的整数。
返回值:0fail
uv.udp_set_multicast_interface()
uv.udp_set_multicast_interface({udp}, {interface_addr})
> 方法形式 udp:set_multicast_interface(interface_addr)
参数
udp: uv_udp_t userdata
interface_addr: string
设置用于发送或接收数据的多播接口。
返回值:0fail
uv.udp_set_broadcast({udp}, {on}) uv.udp_set_broadcast()
> 方法形式 udp:set_broadcast(on)
参数
udp: uv_udp_t userdata
on: boolean
设置广播开启或关闭。
返回值:0fail
uv.udp_set_ttl({udp}, {ttl}) uv.udp_set_ttl()
> 方法形式 udp:set_ttl(ttl)
参数
udp: uv_udp_t userdata
ttl: integer
设置生存时间。
ttl 是 1 到 255 之间的整数。
返回值:0fail
uv.udp_send({udp}, {data}, {host}, {port}, {callback}) uv.udp_send()
> 方法形式 udp:send(data, host, port, callback)
参数
udp: uv_udp_t userdata
数据缓冲区
host: string
port: integer
callback: callable
err: nil字符串
通过 UDP 套接字发送数据。如果套接字以前没有使用 uv.udp_bind() 绑定,它将绑定到 0.0.0.0(“所有接口” IPv4 地址)和一个随机端口号。
返回:uv_udp_send_t userdatafail
uv.udp_try_send({udp}, {data}, {host}, {port}) uv.udp_try_send()
> 方法形式 udp:try_send(data, host, port)
参数
udp: uv_udp_t userdata
数据缓冲区
host: string
port: integer
uv.udp_send() 相同,但如果无法立即完成,则不会排队发送请求。
返回值:integerfail
uv.udp_recv_start({udp}, {callback}) uv.udp_recv_start()
> 方法形式 udp:recv_start(callback)
参数
udp: uv_udp_t userdata
callback: callable
err: nil字符串
数据字符串nil
addr: tablenil
ip: string
port: integer
family: string
flags: table
partial: booleannil
mmsg_chunk: booleannil
准备接收数据。如果套接字之前没有使用 uv.udp_bind() 绑定,则会绑定到 0.0.0.0(“所有接口”的 IPv4 地址)和一个随机端口号。
返回值:0fail
uv.udp_recv_stop({udp}) uv.udp_recv_stop()
> 方法形式 udp:recv_stop()
参数
udp: uv_udp_t userdata
停止监听传入的数据报。
返回值:0fail
uv.udp_connect({udp}, {host}, {port}) uv.udp_connect()
> 方法形式 udp:connect(host, port)
参数
udp: uv_udp_t userdata
host: string
port: integer
将 UDP 句柄与远程地址和端口关联,以便此句柄发送的每条消息都会自动发送到该目标。使用 NULL addr 调用此函数会断开句柄的连接。尝试在已连接的句柄上调用 uv.udp_connect() 将导致 EISCONN 错误。尝试断开未连接的句柄的连接将返回 ENOTCONN 错误。
返回值:0fail

uv_fs_event_t — FS 事件句柄 luv-fs-event-handle uv_fs_event_t

> uv_handle_t 函数也适用。
FS 事件句柄允许用户监控给定路径的变化,例如,如果文件被重命名或发生了通用的变化。此句柄在每个平台上使用最适合工作的后端。
uv.new_fs_event() uv.new_fs_event()
创建并初始化新的 uv_fs_event_t。返回包装它的 Lua 用户数据。
返回值:uv_fs_event_t userdatafail
uv.fs_event_start({fs_event}, {path}, {flags}, {callback}) uv.fs_event_start()
> 方法形式 fs_event:start(path, flags, callback)
参数
fs_event: uv_fs_event_t userdata
路径字符串
flags: table
watch_entry: booleannil(默认:false
stat: booleannil(默认:false
recursive: booleannil(默认:false
callback: callable
err: nil字符串
filename: string
events: table
change: booleannil
rename: booleannil
使用给定的回调启动句柄,该回调将监视指定路径的变化。
返回值:0fail
uv.fs_event_stop() uv.fs_event_stop()
> 方法形式 fs_event:stop()
停止句柄,回调将不再被调用。
返回值:0fail
uv.fs_event_getpath() uv.fs_event_getpath()
> 方法形式 fs_event:getpath()
获取句柄正在监视的路径。
返回值:string失败

uv_fs_poll_t — FS 轮询句柄 luv-fs-poll-handle uv_fs_poll_t

> uv_handle_t 函数也适用。
FS 轮询句柄允许用户监控给定路径的变化。与 uv_fs_event_t 不同,fs 轮询句柄使用 stat 检测文件何时更改,因此它们可以在 fs 事件句柄无法使用的文件系统上工作。
uv.new_fs_poll() uv.new_fs_poll()
创建并初始化新的 uv_fs_poll_t。返回包装它的 Lua 用户数据。
返回值:uv_fs_poll_t userdatafail
uv.fs_poll_start({fs_poll}, {path}, {interval}, {callback}) uv.fs_poll_start()
> 方法形式 fs_poll:start(path, interval, callback)
参数
fs_poll: uv_fs_poll_t userdata
路径字符串
interval: integer
callback: callable
err: nil字符串
prev: tablenil(见 uv.fs_stat
curr: tablenil(见 uv.fs_stat
interval 毫秒检查 path 处的文件是否有更改。
注意:为了最大限度地提高可移植性,请使用多秒间隔。许多文件系统上的亚秒间隔不会检测到所有更改。
返回值:0fail
uv.fs_poll_stop() uv.fs_poll_stop()
> 方法形式 fs_poll:stop()
停止句柄,回调将不再被调用。
返回值:0fail
uv.fs_poll_getpath() uv.fs_poll_getpath()
> 方法形式 fs_poll:getpath()
获取句柄正在监视的路径。
返回值:string失败
大多数文件系统函数可以同步或异步运行。当调用同步版本(通过省略回调)时,函数将立即返回 FS 调用的结果。当调用异步版本(通过提供回调)时,函数将立即返回一个 uv_fs_t userdata 并异步执行其回调;如果遇到错误,传递给回调的第一个也是唯一的参数将是 err 错误字符串;如果操作成功完成,第一个参数将是 nil,其余参数将是 FS 调用的结果。
下面实现 readFile 的同步和异步版本(带有简单的错误处理)作为示例
local function readFileSync(path)
  local fd = assert(uv.fs_open(path, "r", 438))
  local stat = assert(uv.fs_fstat(fd))
  local data = assert(uv.fs_read(fd, stat.size, 0))
  assert(uv.fs_close(fd))
  return data
end
local data = readFileSync("main.lua")
print("synchronous read", data)
local function readFile(path, callback)
  uv.fs_open(path, "r", 438, function(err, fd)
    assert(not err, err)
    uv.fs_fstat(fd, function(err, stat)
      assert(not err, err)
      uv.fs_read(fd, stat.size, 0, function(err, data)
        assert(not err, err)
        uv.fs_close(fd, function(err)
          assert(not err, err)
          return callback(data)
        end)
      end)
    end)
  end)
end
readFile("main.lua", function(data)
  print("asynchronous read", data)
end)
uv.fs_close({fd} [, {callback}]) uv.fs_close()
参数
fd: 整数
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 close(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_open({path}, {flags}, {mode} [, {callback}]) uv.fs_open()
参数
路径字符串
flags: stringinteger
mode: integer
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
fd: integernil
等效于 open(2)。访问 flags 可以是整数,也可以是以下之一:"r""rs""sr""r+""rs+""sr+""w""wx""xw""w+""wx+""xw+""a""ax""xa""a+""ax+""xa+"
返回值(同步版本):integerfail
返回值(异步版本):uv_fs_t userdata
注意:在 Windows 上,libuv 使用 CreateFileW,因此文件始终以二进制模式打开。因此,不支持 O_BINARYO_TEXT 标志。
uv.fs_read({fd}, {size} [, {offset} [, {callback}]]) uv.fs_read()
参数
fd: 整数
size: integer
offset: integernil
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
数据字符串nil
等效于 preadv(2)。返回任何数据。空字符串表示 EOF。
如果 offset 为 nil 或省略,则默认为 -1,表示“使用和更新当前文件偏移量”。
注意:offset >= 0 时,读取操作不会更新当前文件偏移量。
返回值(同步版本):stringfail
返回值(异步版本):uv_fs_t userdata
uv.fs_unlink({path} [, {callback}]) uv.fs_unlink()
参数
路径字符串
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 unlink(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_write({fd}, {data} [, {offset} [, {callback}]]) uv.fs_write()
参数
fd: 整数
数据缓冲区
offset: integernil
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
bytes: integernil
等效于 pwritev(2)。返回写入的字节数。
如果 offset 为 nil 或省略,则默认为 -1,表示“使用和更新当前文件偏移量”。
注意:offset >= 0 时,写入操作不会更新当前文件偏移量。
返回值(同步版本):integerfail
返回值(异步版本):uv_fs_t userdata
uv.fs_mkdir({path}, {mode} [, {callback}]) uv.fs_mkdir()
参数
路径字符串
mode: integer
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 mkdir(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_mkdtemp({template} [, {callback}]) uv.fs_mkdtemp()
参数
template: string
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
path: stringnil
等效于 mkdtemp(3)
返回值(同步版本):stringfail
返回值(异步版本):uv_fs_t userdata
uv.fs_mkstemp({template} [, {callback}]) uv.fs_mkstemp()
参数
template: string
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
fd: integernil
path: stringnil
等效于 mkstemp(3)。返回临时文件句柄和文件名。
返回值(同步版本):integer, stringfail
返回值(异步版本):uv_fs_t userdata
uv.fs_rmdir({path} [, {callback}]) uv.fs_rmdir()
参数
路径字符串
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 rmdir(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_scandir({path} [, {callback}]) uv.fs_scandir()
参数
路径字符串
callback: callable
err: nil字符串
success: uv_fs_t userdatanil
等效于 scandir(3),但 API 稍有不同。返回一个句柄,用户可以将其传递给 uv.fs_scandir_next()
注意:此函数可以同步或异步使用。无论是否提供回调,请求用户数据始终同步返回,如果提供回调,则将相同用户数据传递给回调。
返回值:uv_fs_t userdatafail
uv.fs_scandir_next({fs}) uv.fs_scandir_next()
参数
fs: uv_fs_t userdata
uv_fs_t(由 uv.fs_scandir() 返回)上调用以获取下一个目录条目数据作为 name, type 对。当没有更多条目时,将返回 nil
注意:此函数只有同步版本。有关异步版本,请参见 uv.fs_opendir() 及其相关函数。
返回值:string, stringnilfail
uv.fs_stat({path} [, {callback}]) uv.fs_stat()
参数
路径字符串
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
stat: tablenil(见下文)
等效于 stat(2)
返回值(同步版本):tablefail
dev : integer
mode : integer
nlink : integer
uid : integer
gid : integer
rdev : integer
ino : integer
size : integer
blksize : integer
blocks : integer
flags : integer
gen : integer
atime : table
sec : integer
nsec : integer
mtime : table
sec : integer
nsec : integer
ctime : table
sec : integer
nsec : integer
birthtime : table
sec : integer
nsec : integer
type : string
返回值(异步版本):uv_fs_t userdata
uv.fs_fstat({fd} [, {callback}]) uv.fs_fstat()
参数
fd: 整数
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
stat: tablenil(见 uv.fs_stat
等效于 fstat(2)
返回值(同步版本):tablefail(见 uv.fs_stat
返回值(异步版本):uv_fs_t userdata
uv.fs_lstat({path} [, {callback}]) uv.fs_lstat()
参数
路径字符串
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
stat: tablenil(见 uv.fs_stat
等效于 lstat(2)
返回值(同步版本):tablefail(见 uv.fs_stat()
返回值(异步版本):uv_fs_t userdata
uv.fs_rename({path}, {new_path} [, {callback}]) uv.fs_rename()
参数
路径字符串
new_path: string
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 rename(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_fsync({fd} [, {callback}]) uv.fs_fsync()
参数
fd: 整数
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 fsync(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_fdatasync({fd} [, {callback}]) uv.fs_fdatasync()
参数
fd: 整数
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 fdatasync(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_ftruncate({fd}, {offset} [, {callback}]) uv.fs_ftruncate()
参数
fd: 整数
offset: integer
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 ftruncate(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_sendfile()
uv.fs_sendfile({out_fd}, {in_fd}, {in_offset}, {size} [, {callback}])
参数
out_fd: 整数
in_fd: 整数
in_offset: 整数
size: integer
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
bytes: integernil
sendfile(2) 的有限等效。返回写入的字节数。
返回值(同步版本):integerfail
返回值(异步版本):uv_fs_t userdata
uv.fs_access({path}, {mode} [, {callback}]) uv.fs_access()
参数
路径字符串
mode: integer
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
permission: 布尔值nil
等效于 Unix 上的 access(2)。Windows 使用 GetFileAttributesW()。访问 mode 可以是整数,也可以是包含 "R""W""X" 的字符串。返回 truefalse 表示访问权限。
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_chmod({path}, {mode} [, {callback}]) uv.fs_chmod()
参数
路径字符串
mode: integer
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 chmod(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_fchmod({fd}, {mode} [, {callback}]) uv.fs_fchmod()
参数
fd: 整数
mode: integer
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 fchmod(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_utime({path}, {atime}, {mtime} [, {callback}]) uv.fs_utime()
参数
路径字符串
atime: 数字
mtime: 数字
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 utime(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_futime({fd}, {atime}, {mtime} [, {callback}]) uv.fs_futime()
参数
fd: 整数
atime: 数字
mtime: 数字
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 futime(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_lutime({path}, {atime}, {mtime} [, {callback}]) uv.fs_lutime()
参数
路径字符串
atime: 数字
mtime: 数字
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 lutime(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_link({path}, {new_path} [, {callback}]) uv.fs_link()
参数
路径字符串
new_path: string
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 link(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_symlink({path}, {new_path} [, {flags} [, {callback}]]) uv.fs_symlink()
参数
路径字符串
new_path: string
flags: , 整数, 或 nil
dir: 布尔值
junction: 布尔值
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 symlink(2)。如果省略 flags 参数,则第三个参数将被视为 callback
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_readlink({path} [, {callback}]) uv.fs_readlink()
参数
路径字符串
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
path: stringnil
等效于 readlink(2)
返回值(同步版本):stringfail
返回值(异步版本):uv_fs_t userdata
uv.fs_realpath({path} [, {callback}]) uv.fs_realpath()
参数
路径字符串
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
path: stringnil
等效于 realpath(3)
返回值(同步版本):stringfail
返回值(异步版本):uv_fs_t userdata
uv.fs_chown({path}, {uid}, {gid} [, {callback}]) uv.fs_chown()
参数
路径字符串
uid: 整数
gid: 整数
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 chown(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_fchown({fd}, {uid}, {gid} [, {callback}]) uv.fs_fchown()
参数
fd: 整数
uid: 整数
gid: 整数
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 fchown(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_lchown({fd}, {uid}, {gid} [, {callback}]) uv.fs_lchown()
参数
fd: 整数
uid: 整数
gid: 整数
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
等效于 lchown(2)
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_copyfile({path}, {new_path} [, {flags} [, {callback}]]) uv.fs_copyfile()
参数
路径字符串
new_path: string
flags: , 整数, 或 nil
excl: 布尔值
ficlone: 布尔值
ficlone_force: 布尔值
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
将文件从 path 复制到 new_path。如果省略 flags 参数,则第三个参数将被视为 callback
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_opendir({path} [, {callback} [, {entries}]]) uv.fs_opendir()
参数
路径字符串
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
dir: luv_dir_t userdatanil
entries: 整数nil
将 path 打开为目录流。返回一个句柄,用户可以将其传递给 uv.fs_readdir()entries 参数定义了每次调用 uv.fs_readdir() 时应返回的最大条目数。
返回(同步版本):luv_dir_t userdatafail
返回值(异步版本):uv_fs_t userdata
uv.fs_readdir({dir} [, {callback}]) uv.fs_readdir()
> 方法形式 dir:readdir([callback])
参数
dir: luv_dir_t userdata
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
entries: nil(见下文)
遍历由成功 uv.fs_opendir() 调用返回的目录流 luv_dir_t。返回一个数据表的表,其中条目数 n 等于或小于与关联的 uv.fs_opendir() 调用中使用的 entries 参数。
返回值(同步版本):tablefail
[1, 2, 3, ..., n] :
name : 字符串
type : string
返回值(异步版本):uv_fs_t userdata
uv.fs_closedir({dir} [, {callback}]) uv.fs_closedir()
> 方法形式 dir:closedir([callback])
参数
dir: luv_dir_t userdata
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
success: booleannil
关闭由成功 uv.fs_opendir() 调用返回的目录流。
返回值(同步版本):booleanfail
返回值(异步版本):uv_fs_t userdata
uv.fs_statfs({path} [, {callback}]) uv.fs_statfs()
参数
路径字符串
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
nil(见下文)
等效于 statfs(2)
返回 nil
type : 整数
bsize : 整数
blocks : integer
bfree : 整数
bavail : 整数
files : 整数
ffree : 整数

线程池工作调度 luv-thread-pool-work-scheduling

Libuv 提供了一个线程池,可用于运行用户代码并在循环线程中接收通知。这个线程池在内部用于运行所有文件系统操作,以及 getaddrinfogetnameinfo 请求。
local function work_callback(a, b)
  return a + b
end
local function after_work_callback(c)
  print("The result is: " .. c)
end
local work = uv.new_work(work_callback, after_work_callback)
work:queue(1, 2)
-- output: "The result is: 3"
uv.new_work({work_callback}, {after_work_callback}) uv.new_work()
参数
work_callback: 函数字符串
...: 传递给/来自 uv.queue_work(work_ctx, ...)threadargs
after_work_callback: 函数
...: 从 work_callback 返回的 threadargs
创建并初始化一个新的 luv_work_ctx_t(不是 uv_work_t)。work_callback 是一个 Lua 函数或一个包含 Lua 代码或从函数转储的字节码的字符串。返回包装它的 Lua 用户数据。
返回:luv_work_ctx_t userdata
uv.queue_work({work_ctx}, {...}) uv.queue_work()
> 方法形式 work_ctx:queue(...)
参数
work_ctx: luv_work_ctx_t userdata
...: threadargs
将一个工作请求排队,该请求将在来自线程池的线程中使用来自 ... 的任何附加参数在一个新的 Lua 状态中运行 work_callback。从 work_callback 返回的值将传递给 after_work_callback,后者在主循环线程中调用。
返回值:booleanfail

DNS 实用函数 luv-dns-utility-functions

uv.getaddrinfo({host}, {service} [, {hints} [, {callback}]]) uv.getaddrinfo()
参数
host: 字符串nil
service: 字符串nil
hints: nil
family: 字符串整数nil
socktype: 字符串整数nil
protocol: 字符串整数nil
addrconfig: 布尔值nil
v4mapped: 布尔值nil
all: 布尔值nil
numerichost: 布尔值nil
passive: 布尔值nil
numericserv: 布尔值nil
canonname: 布尔值nil
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
addresses: nil(见下文)
等效于 getaddrinfo(3)nodeservice 可以是 nil,但不能两者都是。
接受字符串的键的有效提示字符串
family: "unix", "inet", "inet6", "ipx", "netlink", "x25", "ax25", "atmpvc", "appletalk", 或 "packet"
socktype: "stream", "dgram", "raw", "rdm", 或 "seqpacket"
protocol: 将使用 getprotobyname(3) 函数查找(示例:"ip", "icmp", "tcp", "udp" 等)
返回值(同步版本):tablefail
[1, 2, 3, ..., n] :
addr : 字符串
family : string
port : 整数nil
socktype : 字符串
protocol : 字符串
canonname : 字符串nil
返回(异步版本):uv_getaddrinfo_t userdatafail
uv.getnameinfo({address} [, {callback}]) uv.getnameinfo()
参数
address:
ip: 字符串nil
port: 整数nil
family: 字符串整数nil
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
host: 字符串nil
service: 字符串nil
等效于 getnameinfo(3)
如果指定,family 必须是以下之一:"unix""inet""inet6""ipx""netlink""x25""ax25""atmpvc""appletalk""packet"
返回(同步版本):字符串, 字符串fail
返回(异步版本):uv_getnameinfo_t userdatafail
Libuv 为多线程和同步原语提供了跨平台实现。API 很大程度上遵循 pthreads API。
uv.new_thread([{options}, ] {entry}, {...}) uv.new_thread()
参数
options: nil
stack_size: 整数nil
entry: 函数字符串
...: 传递给 entrythreadargs
创建并初始化一个 luv_thread_t(不是 uv_thread_t)。返回包装它的 Lua 用户数据并异步执行 entry,它可以是 Lua 函数,也可以是包含 Lua 代码或从函数转储的字节码的字符串。附加参数 ... 将传递给 entry 函数,并且可以提供可选的 options 表。当前接受的 option 字段是 stack_size
返回:luv_thread_t userdatafail
注意:不安全,请确保线程的生命周期结束在 Lua 状态关闭之前。
uv.thread_equal({thread}, {other_thread}) uv.thread_equal()
> 方法形式 thread:equal(other_thread)
参数
thread: luv_thread_t userdata
other_thread: luv_thread_t userdata
返回一个布尔值,指示两个线程是否相同。此函数等效于 __eq 元方法。
返回:布尔值 uv.thread_setaffinity()
uv.thread_setaffinity({thread}, {affinity} [, {get_old_affinity}])
> 方法形式 thread:setaffinity(affinity, [get_old_affinity])
参数
thread: luv_thread_t userdata
affinity:
[1, 2, 3, ..., n] : 布尔值
get_old_affinity: 布尔值
设置指定线程的亲和性设置。
affinity 必须是一个表,每个键都是一个 CPU 编号,值是布尔值,表示该 thread 是否有资格在该 CPU 上运行。如果 affinity 表的长度不小于 uv.cpumask_size(),则表中缺少的任何 CPU 编号的关联性将设置为 false。如果希望设置超过 uv.cpumask_size() 个 CPU 的关联性,则 affinity 必须是一个没有间隙的类似数组的表,因为如果 #affinity 大于 uv.cpumask_size(),它将用作 cpumask_size
如果 get_old_affinitytrue,则将返回 thread 的先前关联性设置。否则,成功调用后将返回 true
注意: 线程关联性设置在 Windows 上不是原子的。在 macOS 上不受支持。
返回值: tablebooleanfail
[1, 2, 3, ..., n] : 布尔值
uv.thread_setaffinity({thread}, {affinity} [, {get_old_affinity}]) uv.thread_setaffinity()
> 方法形式 thread:setaffinity(affinity [, get_old_affinity])
参数
thread: luv_thread_t userdata
affinity: table
get_old_affinity: boolean
设置指定线程的 CPU 关联性设置。如果 get_old_affinitytrue,则将返回 thread 的先前关联性设置。否则,成功调用后将返回 true
注意: 线程关联性设置在 Windows 上不是原子的。在 macOS 上不受支持。
返回值:table失败
[1, 2, 3, ..., n] : 布尔值
uv.thread_getaffinity({thread} [, {mask_size}]) uv.thread_getaffinity()
> 方法形式 thread:getaffinity([mask_size])
mask_size: integer
返回值:integerfail
获取指定线程的关联性设置。
如果提供了 mask_size,它必须大于或等于 uv.cpumask_size()。如果省略了 mask_size 参数,则将使用 uv.cpumask_size() 的返回值。返回一个类似数组的表,其中每个键都对应一个 CPU 编号,值是布尔值,表示该 thread 是否有资格在该 CPU 上运行。
参数
thread: luv_thread_t userdata
注意: 线程关联性获取在 Windows 上不是原子的。在 macOS 上不受支持。
uv.thread_getcpu() uv.thread_getcpu()
获取调用线程正在运行的 CPU 编号。
注意: 第一个 CPU 将返回为编号 1,而不是 0。这允许编号与 uv.thread_getaffinityuv.thread_setaffinity 中使用的表键相对应。
uv.thread_setpriority({thread}, {priority}) uv.thread.setpriority()
> 方法形式 thread:setpriority(priority)
priority: number
返回值:booleanfail
设置指定线程的调度优先级设置。在某些平台上,它需要提升的权限才能设置特定优先级。优先级可以设置为以下常量
uv.constants.THREAD_PRIORITY_HIGHEST
参数
thread: luv_thread_t userdata
uv.constants.THREAD_PRIORITY_ABOVE_NORMAL
uv.constants.THREAD_PRIORITY_NORMAL
uv.constants.THREAD_PRIORITY_BELOW_NORMAL
uv.constants.THREAD_PRIORITY_LOWEST
uv.thread_getpriority({thread}) uv.thread.getpriority()
> 方法形式 thread:getpriority()
获取线程的优先级设置。
检索指定线程的调度优先级。返回的优先级值是平台相关的。
对于 Linux,当调度策略为 SCHED_OTHER(默认)时,优先级为 0。
参数
thread: luv_thread_t userdata
返回值: numberfail
返回值:booleanfail
uv.thread_self() uv.thread_self()
参数
返回调用此方法的线程的句柄。
返回值: luv_thread_t
返回值:无。

uv.thread_create({entry} [, {args}]) uv.thread_create()

entry: function
args: table
返回值:string失败
创建并启动一个新线程。entry 参数必须是一个函数,它将作为新线程的入口点运行。args 参数是一个表,它将作为参数传递给 entry 函数。entry 函数不应返回任何内容,并且应以 uv.thread_exit() 退出。返回一个新的 luv_thread_t 句柄,该句柄标识新创建的线程。
uv.thread_exit({retval}) uv.thread_exit()
返回值:string失败
retval: any
参数
从线程中退出。此函数应由 uv.thread_create() 创建的线程中的入口点函数调用。可选的 retval 参数将被传递回 uv.thread_join()
uv.thread_join({thread}) uv.thread_join()
返回值:0fail
> 方法形式 thread:join()
等待 thread 完成执行其入口函数。
返回值:string失败
uv.sleep({msec}) uv.sleep()
参数
msec: integer
暂停调用此方法的线程,持续时间为指定的毫秒数。
返回值:0fail
MISCELLANEOUS UTILITIES luv-miscellaneous-utilities
uv.exepath() uv.exepath()
返回可执行文件路径。
uv.cwd() uv.cwd()
返回当前工作目录。
返回可执行文件路径。
uv.chdir({cwd}) uv.chdir()
cwd: string
返回可执行文件路径。
使用字符串 cwd 设置当前工作目录。
uv.get_process_title() uv.get_process_title()
返回可执行文件路径。
返回当前进程的标题。
uv.set_process_title({title}) uv.set_process_title()
返回值:integerfail
title: string
使用字符串 title 设置当前进程的标题。
返回值:table失败
uv.get_total_memory() uv.get_total_memory()
sec : integer
返回当前系统总内存(以字节为单位)。
返回值: number
sec : integer
返回当前系统总内存(以字节为单位)。
uv.get_free_memory() uv.get_free_memory()
返回当前系统空闲内存(以字节为单位)。
uv.get_constrained_memory() uv.get_constrained_memory()
获取基于操作系统施加的限制,进程可用的内存量(以字节为单位)。如果不存在此类限制,或者限制未知,则返回 0。请注意,此值不寻常地小于或大于系统总内存。
uv.get_available_memory() uv.get_available_memory()
获取进程仍可用的空闲内存量(以字节为单位)。这与 uv.get_free_memory() 不同,因为它考虑了操作系统施加的任何限制。如果不存在此类限制,或者限制未知,则返回的量将与 uv.get_free_memory() 相同。
uv.resident_set_memory() uv.resident_set_memory()
返回当前进程的驻留集大小(RSS)。
uv.getrusage() uv.getrusage()
返回资源使用情况。
utime : table(用户 CPU 时间使用量)
usec : integer
stime : table(系统 CPU 时间使用量)
maxrss : integer(最大驻留集大小)
ixrss : integer(积分共享内存大小)
idrss : integer(积分非共享数据大小)
isrss : integer(积分非共享堆栈大小)
minflt : integer(页面回收(软页面错误))
majflt : integer(页面错误(硬页面错误))
返回:integer
nswap : integer(交换)
inblock : integer(块输入操作)
返回值:table失败
[1, 2, 3, ..., n] :
oublock : integer(块输出操作)
msgsnd : integer(发送的 IPC 消息)
msgrcv : integer(接收的 IPC 消息)
nsignals : integer(接收的信号)
nvcsw : integer(自愿上下文切换)
nivcsw : integer(非自愿上下文切换)
uv.available_parallelism() uv.available_parallelism()
返回程序应使用的默认并行量估计值。始终返回非零值。
在 Linux 上,检查调用线程的 CPU 关联性掩码以确定它是否已固定到特定 CPU。
在 Windows 上,在具有超过 64 个逻辑 CPU 的系统上,可用并行性可能被低估。
返回值:integerfail
在其他平台上,报告操作系统认为在线的 CPU 数量。
uv.cpu_info() uv.cpu_info()
将系统上的 CPU 信息返回为一个表,每个表都是每个找到的 CPU 的表。
model : string
返回:integer
speed : number
times : table
user : number
返回:integer
speed : number
nice : number
参数
sys : number
idle : number
返回值:无。
speed : number
irq : number
参数
sys : number
uv.cpumask_size() uv.cpumask_size()
返回值:无。
speed : number
返回用于进程/线程关联性的掩码的最大大小,如果当前平台不支持关联性,则返回 ENOTSUP
uv.getpid() uv.getpid()
返回可执行文件路径。
已弃用: 请改用 uv.os_getpid()
参数
uv.getuid() uv.getuid()
返回进程的用户 ID。
注意: 这不是 libuv 函数,在 Windows 上不受支持。
uv.getgid() uv.getgid()
返回值:table失败
返回进程的组 ID。
uv.setuid({id}) uv.setuid()
id: integer
使用整数 id 设置进程的用户 ID。
uv.constants.THREAD_PRIORITY_LOWEST
uv.setgid({id}) uv.setgid()
使用整数 id 设置进程的组 ID。
返回值:无。
uv.hrtime() uv.hrtime()
以纳秒为单位返回当前高分辨率时间,作为数字。这相对于过去某个任意时间。它与当天的时间无关,因此不受时钟漂移的影响。主要用途是测量时间间隔之间的间隔。
uv.clock_gettime({clock_id}) uv.clock_gettime()
clock_id: string
返回值:无。
uv.hrtime() uv.hrtime()
以纳秒为单位返回当前高分辨率时间,作为数字。这相对于过去某个任意时间。它与当天的时间无关,因此不受时钟漂移的影响。主要用途是测量时间间隔之间的间隔。
从高分辨率实时或单调时钟源获取当前系统时间。clock_id 可以是字符串 "monotonic""realtime"
参数
fd: 整数
实时时钟从 UNIX 纪元(1970-01-01)开始计数,并会受到时间调整的影响;它可以倒流。
返回:string
单调时钟从过去的某个任意点开始计数,并且永远不会倒流。
sec: integer
返回:integer, integerfail
nsec: integer
uv.uptime() uv.uptime()
返回当前系统运行时间(以秒为单位)。
uv.print_all_handles() uv.print_all_handles()
ip : string
family : string
将与主循环关联的所有句柄打印到 stderr。格式为 [flags] handle-type handle-address 。标志是 R 表示引用、A 表示活动和 I 表示内部。
注意: 这在 Windows 上不可用。
警告: 此函数用于临时调试,没有 API/ABI 稳定性保证。
uv.print_active_handles() uv.print_active_handles()
参数
uv.print_all_handles() 相同,只是只打印活动句柄。
uv.guess_handle({fd}) uv.guess_handle()
返回值:string失败
用于检测应与给定文件描述符 fd 一起使用哪种类型的流。通常,这将在初始化期间使用,以猜测 stdio 流的类型。
参数
uv.print_all_handles() 相同,只是只打印活动句柄。
uv.gettimeofday() uv.gettimeofday()
返回值:string失败
uv.loadavg() uv.loadavg()
返回负载平均值,以三元组形式表示。Windows 上不支持。
返回值:number, number, number
uv.os_uname() uv.os_uname()
返回系统信息。
返回当前系统运行时间(以秒为单位)。
sysname : string
release : string
version : string
machine : string
uv.os_gethostname() uv.os_gethostname()
返回主机名。
返回:string
uv.os_getenv({name} [, {size}]) uv.os_getenv()
参数
name: string
size: integer (默认 = LUAL_BUFFERSIZE)
返回由 name 指定的环境变量,以字符串形式表示。可以通过定义 size 来设置内部缓冲区大小。如果省略,则使用 LUAL_BUFFERSIZE。如果环境变量超过内部缓冲区中可用的存储空间,则返回 ENOBUFS。如果不存在匹配的环境变量,则返回 ENOENT
返回值:string失败
警告: 此函数不是线程安全的。
uv.os_setenv({name}, {value}) uv.os_setenv()
参数
name: string
value: string
使用字符串 value 设置由 name 指定的环境变量。
返回值:booleanfail
警告: 此函数不是线程安全的。
uv.os_unsetenv({name}) uv.os_unsetenv()
参数
name: string
取消设置由 name 指定的环境变量。
返回值:booleanfail
警告: 此函数不是线程安全的。
uv.os_environ() uv.os_environ()
将所有环境变量作为名称与其对应值关联的动态表返回。
返回当前系统运行时间(以秒为单位)。
警告: 此函数不是线程安全的。
uv.os_homedir() uv.os_homedir()
返回值:string失败
警告: 此函数不是线程安全的。
uv.os_tmpdir() uv.os_tmpdir()
返回值:string失败
警告: 此函数不是线程安全的。
uv.os_get_passwd() uv.os_get_passwd()
返回密码文件信息。
返回当前系统运行时间(以秒为单位)。
username : string
uid : integer
gid : integer
shell : string
homedir : string
uv.os_getpid() uv.os_getpid()
返回当前进程 ID。
返回可执行文件路径。
uv.os_getppid() uv.os_getppid()
返回父进程 ID。
返回可执行文件路径。
uv.os_getpriority({pid}) uv.os_getpriority()
参数
pid整数
返回由 pid 指定的进程的调度优先级。
uv.constants.THREAD_PRIORITY_LOWEST
uv.os_setpriority({pid}, {priority}) uv.os_setpriority()
参数
pid整数
priority: integer
设置由 pid 指定的进程的调度优先级。priority 范围在 -20(高优先级)和 19(低优先级)之间。
返回值:booleanfail
uv.random({len}, {flags} [, {callback}]) uv.random()
参数
len: integer
flags: nil (见下文)
callback: callable(异步版本)或 nil(同步版本)
err: nil字符串
bytes: stringnil
用从系统 CSPRNG 获取的加密强随机字节填充长度为 len 的字符串。flags 预留供将来扩展使用,目前必须为 nil0{}
不可能出现短读。当可用的随机字节少于 len 时,会返回一个非零错误值或传递给回调。如果省略回调,则此函数将同步完成。
当可用熵不足时,同步版本可能会无限期阻塞。异步版本可能永远不会完成,当系统熵不足时。
返回值(同步版本):stringfail
返回值(异步版本):0fail
uv.translate_sys_error({errcode}) uv.translate_sys_error()
参数
errcode: integer
返回等效于给定平台相关错误代码的 libuv 错误消息和错误名称(两者都以字符串形式表示,请参阅 luv-error-handling 中的 errname):Unix 上的 POSIX 错误代码(存储在 errno 中的代码)和 Windows 上的 Win32 错误代码(由 GetLastError() 或 WSAGetLastError() 返回的代码)。
返回值:string, stringnil
uv.metrics_idle_time() uv.metrics_idle_time()
检索事件循环在内核的事件提供程序(例如 epoll_wait)中处于空闲状态的时间量。此调用是线程安全的。
返回值是从 uv_loop_t 被配置为收集空闲时间开始,在内核事件提供程序中花费的累积空闲时间。
注意: 在使用 "metrics_idle_time" 调用 loop_configure 之前,事件循环不会开始累积事件提供程序的空闲时间。
返回可执行文件路径。
uv.metrics_info() uv.metrics_info()
从当前事件循环指标集中获取指标表。建议在 prepare 回调中检索这些指标(请参阅 uv.new_prepare()uv.prepare_start()),以确保指标计数器之间没有不一致。
返回当前系统运行时间(以秒为单位)。
loop_count : integer
events : integer
events_waiting : integer
本文件是对 LUV 文档的重新格式化版本,与 luv 存储库 https://github.com/luvit/luv/commit/dcd1a1cad5b05634a7691402d6ca2f214fb4ae76 的提交 dcd1a1c(2023 年 8 月 23 日)保持一致。
主要
命令索引
快速参考