Nvim :help 页面,由 生成 于 来源, 使用 tree-sitter-vimdoc 解析器。
uv 模块,但可以在其他 Lua 环境中使用。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 luvituv。该模块主要由函数组成,其名称与其原始 libuv 版本相对应。例如,libuv 函数 uv_tcp_bind 在 uv.tcp_bind() 中有一个 luv 版本。目前,仅存在两个非函数字段:uv.constants 和 uv.errno,它们是表。uv.tcp_bind(server, host, port) 可以作为 server:bind(host, port) 替代调用。请注意,第一个参数 server 成为对象,并且从函数名中删除了 tcp_。方法形式在下面存在的地方进行了说明。callable: 一个 function;或一个带有 __call 元方法的 table 或 userdatabuffer: 一个 string 或一个 string 的连续 tablethreadargs: 类型为 nil、boolean、number、string 或 userdata 的可变参数 (...);参数数量限制为 9 个。uv.errno 公开,但用于处理它们的函数并未公开给 luv 用户。相反,如果遇到内部错误,luv 函数将返回一个可断言的 nil, err, name 元组给调用者。nil 代表性地表示失败err 是一个格式为 {name}: {message} 的字符串{name} 是 uv_err_name 内部提供的错误名称{message} 是 uv_strerror 内部提供的可读消息name 与用于构造 err 的字符串相同fail 伪类型。0 以指示成功,或者有时什么也不返回。这些情况在下面进行了说明。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: 不支持套接字类型。integerstringuv_loop_t — 事件循环loop_close()。仅在循环执行完毕且所有打开的句柄和请求已关闭后才调用此函数,否则它将返回 EBUSY。0 或 failmode: string 或 nil(默认值:"default")"once": 轮询 I/O 一次。注意,如果没有任何待处理的回调,此函数将阻塞。完成后返回 false(没有活动的句柄或请求剩余),或如果预期更多回调(意味着您应该在将来的某个时间再次运行事件循环),则返回 true。"nowait": 轮询 I/O 一次,但如果没有任何待处理的回调,则不阻塞。完成后返回 false(没有活动的句柄或请求剩余),或如果预期更多回调(意味着您应该在将来的某个时间再次运行事件循环),则返回 true。boolean 或 failuv.run(),但如果您直接使用 luv 绑定,则需要在注册初始事件回调集后调用它以启动事件循环。option: string...: 取决于 option,见下文"block_signal": 在轮询新事件时阻塞信号。loop_configure() 的第二个参数是信号名称(作为小写字符串)或信号编号。此操作目前仅针对 "sigprof" 信号实现,以在使用采样分析器时抑制不必要的唤醒。请求其他信号将以 EINVAL 失败。"metrics_idle_time": 累积事件循环在事件提供者中花费的空闲时间量。此选项对于使用 metrics_idle_time() 是必需的。uv.loop_configure("block_signal", "sigprof")0 或 failENOSYS 错误的准备;这意味着循环选项不受平台支持。nil。string 或 niltrue;否则返回 false。boolean 或 failuv.run("nowait") 结合使用,在一个线程中轮询并在另一个线程中运行事件循环的回调integer 或 nilintegerintegercallback: callablecallback 将对每个句柄执行。-- 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 — 基本请求uv_req_t 是所有 libuv 请求类型的基本类型。req:cancel()0 或 failreq:get_type()string, integeruv_handle_t — 基本句柄uv_handle_t 是所有 libuv 句柄类型的基本类型。此处定义的所有 API 函数都适用于任何句柄类型。handle:is_active()true,如果句柄处于非活动状态,则返回 false。“活动”的含义取决于句柄的类型boolean 或 failhandle:is_closing()true,否则返回 false。boolean 或 failhandle:close([callback])callback: callable 或 nilcallback 将在此调用之后异步调用。必须在释放内存之前对每个句柄调用此函数。callback 仍将推迟到事件循环的下一次迭代。这为您提供了一个机会来释放与句柄关联的任何资源。uv_connect_t 或 uv_write_t)会被取消,它们的回调会异步调用 ECANCELED。handle:ref()handle:unref()handle:has_ref()true,否则返回 false。boolean 或 failhandle:send_buffer_size([size])size: integer 或 nil(默认值:0)size(或为 0),则将返回当前发送缓冲区大小;否则,将使用 size 设置新的发送缓冲区大小。integer 或 fail(如果 size 为 nil 或 0)0 或 fail(如果 size 不为 nil 且不为 0)handle:recv_buffer_size([size])size: integer 或 nil(默认值:0)size(或为 0),则将返回当前发送缓冲区大小;否则,将使用 size 设置新的发送缓冲区大小。integer 或 fail(如果 size 为 nil 或 0)0 或 fail(如果 size 不为 nil 且不为 0)handle:fileno()EINVAL 失败。EBADF。integer 或 failhandle:get_type()string, integeruv_timer_t — 定时器句柄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()
endtimer:start(timeout, repeat, callback)timer: uv_timer_t 用户数据timeout: 整数repeat: 整数callback: callabletimeout 和 repeat 单位为毫秒。timeout 为零,则回调将在下一次事件循环迭代时触发。如果 repeat 非零,则回调将在 timeout 毫秒后首次触发,然后每隔 repeat 毫秒重复触发一次。0 或 failtimer:stop()timer: uv_timer_t 用户数据0 或 failtimer:again()timer: uv_timer_t 用户数据EINVAL。0 或 failtimer:set_repeat(repeat)timer: uv_timer_t 用户数据repeat: 整数timer:get_repeat()timer: uv_timer_t 用户数据integertimer:get_due_in()timer: uv_timer_t 用户数据integeruv_prepare_t — 预备句柄local prepare = uv.new_prepare()
prepare:start(function()
print("Before I/O polling")
end)uv_prepare_t 用户数据prepare:start(callback)prepare: uv_prepare_t 用户数据callback: callable0 或 failprepare:stop()prepare: uv_prepare_t 用户数据0 或 failuv_check_t — 检查句柄local check = uv.new_check()
check:start(function()
print("After I/O polling")
end)uv_check_t 用户数据check:start(callback)check: uv_check_t 用户数据callback: callable0 或 failcheck:stop()check: uv_check_t 用户数据0 或 failuv_idle_t — 空闲句柄local idle = uv.new_idle()
idle:start(function()
print("Before I/O polling, no blocking")
end)uv_idle_t 用户数据idle:start(callback)idle: uv_idle_t 用户数据callback: callable0 或 failidle:stop()idle: uv_idle_t 用户数据0 或 failuv_async_t — 异步句柄local async
async = uv.new_async(function()
print("async operation ran")
async:close()
end)
async:send()callback: callable...: threadargs 传递给/从 uv.async_send(async, ...)uv_async_t 用户数据 或 失败async:send(...)async: uv_async_t 用户数据...: threadargs0 或 failuv.async_send(async) 的调用,也就是说,并非每次调用它都会产生回调的执行。例如:如果在回调被调用之前连续调用了 5 次 uv.async_send(),则回调只会调用一次。如果在回调被调用后再次调用 uv.async_send(),则它将再次被调用。uv_poll_t — 轮询句柄uv_poll_t 用于任何其他目的;uv_tcp_t、uv_udp_t 等提供了比 uv_poll_t 可以实现的更快速、更可扩展的实现,尤其是在 Windows 上。fd: 整数uv_poll_t 用户数据 或 失败fd: 整数uv_poll_t 用户数据 或 失败poll:start(events, callback)poll: uv_poll_t 用户数据events: 字符串 或 nil(默认值:"rw")callback: callableerr: nil 或 字符串events: 字符串 或 nilevents 为:"r"、"w"、"rw"、"d"、"rd"、"wd"、"rwd"、"p"、"rp"、"wp"、"rwp"、"dp"、"rdp"、"wdp" 或 "rwdp",其中 r 为 READABLE、w 为 WRITABLE、d 为 DISCONNECT,p 为 PRIORITIZED。一旦检测到事件,回调将被调用,状态设置为 0,事件字段上将设置检测到的事件。0 或 failuv.poll_start() 是可以的。这样做将更新正在监视的事件掩码。poll:stop()poll: uv_poll_t 用户数据0 或 failuv_signal_t — 信号句柄-- 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_signal_t 用户数据 或 失败信号:开始(信号, 回调)信号:uv_signal_t 用户数据信号:整数 或 字符串callback: callable信号:字符串信号:开始一次(信号, 回调)信号:uv_signal_t 用户数据信号:整数 或 字符串callback: callable信号:字符串0 或 fail信号:停止()信号:uv_signal_t 用户数据0 或 failuv_process_t — 进程句柄路径:字符串选项:表(见下文)退出时:可调用代码:整数信号:整数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)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 条目可以采用多种形式。nil 占位符意味着在子进程中忽略该 fd。退出时。uv_process_t 用户数据, 整数进程:杀死(信号)进程:uv_process_t 用户数据信号:整数 或 字符串 或 nil(默认:sigterm)0 或 failpid:整数信号:整数 或 字符串 或 nil(默认:sigterm)0 或 fail进程:获取_pid()进程:uv_process_t 用户数据integeruv_stream_t — 流句柄流:关闭([回调])uv_shutdown_t 用户数据 或 失败流:监听(待处理, 回调)待处理 指示内核可能排队的连接数,与 listen(2) 相同。收到新的传入连接时,将调用回调。0 或 fail流:接受(客户端流)0 或 failserver:listen(128, function (err)
local client = uv.new_tcp()
server:accept(client)
end)流:读开始(回调)0 或 failstream:read_start(function (err, chunk)
if err then
-- handle read error
elseif chunk then
-- handle data
else
-- handle disconnect
end
end)流:读停止()0 或 fail流:写入(数据, [回调])数据 可以是 Lua 字符串或字符串表。如果传递了表,则 C 后端将使用 writev 在单个系统调用中发送所有字符串。回调 用于了解写入何时完成。uv_write_t 用户数据 或 失败流:写入2(数据, 发送句柄, [回调])数据:缓冲区callback: callable 或 nilerr: nil 或 字符串ipc 选项 true 初始化。uv_write_t 用户数据 或 失败发送句柄 必须是 TCP 套接字或管道,它是服务器或连接(侦听或已连接状态)。绑定套接字或管道将被认为是服务器。stream:try_write(data)数据:缓冲区integer 或 failstream:try_write2(data, send_handle)integer 或 failstream:is_readable()true,否则返回 false。booleanstream:is_writable()true,否则返回 false。booleanstream:set_blocking(blocking)blocking: boolean0 或 failstream:get_write_queue_size()integeruv_tcp_t — TCP 处理程序flags: string 或 nil"unix"、"inet"、"inet6"、"ipx"、"netlink"、"x25"、"ax25"、"atmpvc"、"appletalk" 或 "packet"。uv_tcp_t 用户数据 或 失败tcp:open(sock)tcp: uv_tcp_t 用户数据sock: integer0 或 failtcp:nodelay(enable)tcp: uv_tcp_t 用户数据enable: boolean0 或 failtcp:keepalive(enable, [delay])tcp: uv_tcp_t 用户数据enable: booleandelay: integer 或 nildelay 是以秒为单位的初始延迟,当 enable 为 false 时忽略。0 或 failtcp:simultaneous_accepts(enable)tcp: uv_tcp_t 用户数据enable: boolean0 或 failtcp:bind(host, port, [flags])tcp: uv_tcp_t 用户数据host: stringport: integerflags: table 或 nilipv6only: booleanhost 应为 IP 地址,而不是域名。任何 flags 都是使用表设置的,该表具有等于 true 或 false 的字段 ipv6only。uv.tcp_bind()、uv.listen() 或 uv.tcp_connect() 的 EADDRINUSE 错误。也就是说,成功调用此函数并不能保证对 uv.listen() 或 uv.tcp_connect() 的调用也会成功。0 让操作系统分配一个短暂端口。您可以在以后使用 uv.tcp_getsockname() 查看它。0 或 failtcp:getpeername()tcp: uv_tcp_t 用户数据table 或 失败ip : stringfamily : stringport : integertcp:getsockname()tcp: uv_tcp_t 用户数据table 或 失败ip : stringfamily : stringport : integertcp:connect(host, port, callback)tcp: uv_tcp_t 用户数据host: stringport: integercallback: callableerr: nil 或 字符串uv_connect_t 用户数据 或 失败local client = uv.new_tcp()
client:connect("127.0.0.1", 8080, function (err)
-- check error and carry on.
end)tcp:write_queue_size()tcp:close_reset([callback])tcp: uv_tcp_t 用户数据callback: callable 或 niluv.tcp_close_reset() 调用。socktype: string、integer 或 nil(默认值:stream)protocol: string、integer 或 nil(默认值:0)flags1: table 或 nilnonblock: boolean(默认值:false)flags2: table 或 nilnonblock: boolean(默认值:false)socktype 必须是 "stream"、"dgram"、"raw"、"rdm" 或 "seqpacket" 中的一个。protocol 设置为 0 或 nil 时,它将根据套接字的域和类型自动选择。当 protocol 指定为字符串时,它将使用 getprotobyname(3) 函数查找(例如:"ip"、"icmp"、"tcp"、"udp" 等)。nonblock: 为 OVERLAPPED 或 FIONBIO/`O_NONBLOCK` I/O 使用打开指定的套接字句柄。这对于将由 libuv 使用的句柄来说是推荐的,否则通常不建议这样做。AF_UNIX 的 socketpair(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 — 管道处理程序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)ipc: boolean 或 nil(默认值:false)ipc 参数是一个布尔值,指示此管道是否将用于进程之间的句柄传递。uv_pipe_t 用户数据 或 失败pipe:open(fd)pipe: uv_pipe_t 用户数据fd: 整数0 或 failpipe:bind(name)pipe: uv_pipe_t 用户数据name: string0 或 failpipe:connect(name, [callback])pipe: uv_pipe_t 用户数据name: stringcallback: callable 或 nilerr: nil 或 字符串uv_connect_t 用户数据 或 失败pipe:getsockname()pipe: uv_pipe_t 用户数据string 或 失败pipe:getpeername()pipe: uv_pipe_t 用户数据string 或 失败pipe:pending_instances(count)pipe: uv_pipe_t 用户数据count: integerpipe:pending_count()pipe: uv_pipe_t 用户数据integerpipe:pending_type()pipe: uv_pipe_t 用户数据uv.pipe_pending_type() 返回的类型初始化一个句柄,并调用 uv.accept(pipe, handle)。stringpipe:chmod(flags)pipe: uv_pipe_t 用户数据flags: stringflags 可以是:"r"、"w"、"rw" 或 "wr",其中 r 代表 READABLE,w 代表 WRITABLE。此函数为阻塞函数。0 或 failread_flags: table 或 nilnonblock: boolean(默认值:false)write_flags: table 或 nilnonblock: boolean(默认值:false)write fd 并从 read fd 读取。生成的句柄可以传递给 pipe_open,与 spawn 一起使用,或用于任何其他目的。nonblock: 为 OVERLAPPED 或 FIONBIO/`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)pipe:pipe_bind(name, flags)pipe: uv_pipe_t 用户数据name: stringflags: integer 或 table 或 nil (默认值:0)type(flags) 为 number,则它必须为 0 或 uv.constants.PIPE_NO_TRUNCATE。type(flags) 为 table,则它必须为 {} 或 { no_truncate = true|false }。type(flags) 为 nil,则使用默认值 0。EINVAL。0 或 failpipe:connect2(name, [flags], [callback])pipe: uv_pipe_t 用户数据name: stringflags: integer 或 table 或 nil (默认值:0)callback: callable 或 nilerr: nil 或 字符串标志:type(flags) 为 number,则它必须为 0 或 uv.constants.PIPE_NO_TRUNCATE。type(flags) 为 table,则它必须为 {} 或 { no_truncate = true|false }。type(flags) 为 nil,则使用默认值 0。EINVAL。uv_connect_t 用户数据 或 失败uv_tty_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)fd: 整数readable: booleanuv_tty_t userdata 或 failtty:set_mode(mode)tty: uv_tty_t userdatamode: integermode 是一个 C 枚举,具有以下值0 或 failEBUSY 而失败。0 或 failtty:get_winsize()tty: uv_tty_t userdatainteger, integer 或 failstate: string"supported" 或 "unsupported"。"supported" 或 "unsupported"。ENOTSUP。string 或 失败uv_udp_t — UDP 句柄flags: table 或 nilfamily: string 或 nilmmsgs: integer 或 nil (默认值:1)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 userdata 或 failudp:get_send_queue_size()integerudp:get_send_queue_count()integerudp:open(fd)udp: uv_udp_t userdatafd: 整数0 或 failudp:bind(host, port, [flags])udp: uv_udp_t userdatahost: stringport: numberflags: table 或 nilipv6only: booleanreuseaddr: booleanflags 都使用包含字段 reuseaddr 或 ipv6only 等于 true 或 false 的表设置。0 或 failudp:getsockname()udp: uv_udp_t userdatatable 或 失败ip : stringfamily : stringport : integerudp:getpeername()udp: uv_udp_t userdatatable 或 失败ip : stringfamily : stringport : integer{udp}, {multicast_addr}, {interface_addr}, {membership})udp:set_membership(multicast_addr, interface_addr, membership)udp: uv_udp_t userdatamulticast_addr: stringinterface_addr: string 或 nilmembership: stringmulticast_addr 是要设置成员资格的多播地址。interface_addr 是接口地址。membership 可以是字符串 "leave" 或 "join"。0 或 fail{udp}, {multicast_addr}, {interface_addr}, {source_addr}, {membership})udp:set_source_membership(multicast_addr, interface_addr, source_addr, membership)udp: uv_udp_t userdatamulticast_addr: stringinterface_addr: string 或 nilsource_addr: stringmembership: stringmulticast_addr 是要设置成员资格的多播地址。interface_addr 是接口地址。source_addr 是源地址。membership 可以是字符串 "leave" 或 "join"。0 或 failudp:set_multicast_loop(on)udp: uv_udp_t userdataon: boolean0 或 failudp:set_multicast_ttl(ttl)udp: uv_udp_t userdatattl: integerttl 是 1 到 255 之间的整数。0 或 failudp:set_multicast_interface(interface_addr)udp: uv_udp_t userdatainterface_addr: string0 或 failudp:set_broadcast(on)udp: uv_udp_t userdataon: boolean0 或 failudp:set_ttl(ttl)udp: uv_udp_t userdatattl: integerttl 是 1 到 255 之间的整数。0 或 failudp:send(data, host, port, callback)udp: uv_udp_t userdata数据:缓冲区host: stringport: integercallback: callableerr: nil 或 字符串0.0.0.0(“所有接口” IPv4 地址)和一个随机端口号。uv_udp_send_t userdata 或 failudp:try_send(data, host, port)udp: uv_udp_t userdata数据:缓冲区host: stringport: integerinteger 或 failudp:recv_start(callback)udp: uv_udp_t userdatacallback: callableerr: nil 或 字符串数据:字符串 或 niladdr: table 或 nilip: stringport: integerfamily: stringflags: tablepartial: boolean 或 nilmmsg_chunk: boolean 或 nil0.0.0.0(“所有接口”的 IPv4 地址)和一个随机端口号。0 或 failudp:recv_stop()udp: uv_udp_t userdata0 或 failudp:connect(host, port)udp: uv_udp_t userdatahost: stringport: integeruv.udp_connect() 将导致 EISCONN 错误。尝试断开未连接的句柄的连接将返回 ENOTCONN 错误。0 或 failuv_fs_event_t — FS 事件句柄uv_fs_event_t userdata 或 failfs_event:start(path, flags, callback)fs_event: uv_fs_event_t userdata路径:字符串flags: tablewatch_entry: boolean 或 nil(默认:false)stat: boolean 或 nil(默认:false)recursive: boolean 或 nil(默认:false)callback: callableerr: nil 或 字符串filename: stringevents: tablechange: boolean 或 nilrename: boolean 或 nil0 或 failfs_event:stop()0 或 failfs_event:getpath()string 或 失败uv_fs_poll_t — FS 轮询句柄stat 检测文件何时更改,因此它们可以在 fs 事件句柄无法使用的文件系统上工作。uv_fs_poll_t userdata 或 failfs_poll:start(path, interval, callback)fs_poll: uv_fs_poll_t userdata路径:字符串interval: integercallback: callableerr: nil 或 字符串prev: table 或 nil(见 uv.fs_stat)curr: table 或 nil(见 uv.fs_stat)interval 毫秒检查 path 处的文件是否有更改。0 或 failfs_poll:stop()0 或 failfs_poll:getpath()string 或 失败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)fd: 整数callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilclose(2)。boolean 或 failuv_fs_t userdata路径:字符串flags: string 或 integermode: integercallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串fd: integer 或 nilopen(2)。访问 flags 可以是整数,也可以是以下之一:"r"、"rs"、"sr"、"r+"、"rs+"、"sr+"、"w"、"wx"、"xw"、"w+"、"wx+"、"xw+"、"a"、"ax"、"xa"、"a+"、"ax+" 或 "xa+"。integer 或 failuv_fs_t userdataCreateFileW,因此文件始终以二进制模式打开。因此,不支持 O_BINARY 和 O_TEXT 标志。fd: 整数size: integeroffset: integer 或 nilcallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串数据:字符串 或 nilpreadv(2)。返回任何数据。空字符串表示 EOF。offset 为 nil 或省略,则默认为 -1,表示“使用和更新当前文件偏移量”。offset >= 0 时,读取操作不会更新当前文件偏移量。string 或 failuv_fs_t userdata路径:字符串callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilunlink(2)。boolean 或 failuv_fs_t userdatafd: 整数数据:缓冲区offset: integer 或 nilcallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串bytes: integer 或 nilpwritev(2)。返回写入的字节数。offset 为 nil 或省略,则默认为 -1,表示“使用和更新当前文件偏移量”。offset >= 0 时,写入操作不会更新当前文件偏移量。integer 或 failuv_fs_t userdata路径:字符串mode: integercallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilmkdir(2)。boolean 或 failuv_fs_t userdatatemplate: stringcallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串path: string 或 nilmkdtemp(3)。string 或 failuv_fs_t userdatatemplate: stringcallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串fd: integer 或 nilpath: string 或 nilmkstemp(3)。返回临时文件句柄和文件名。integer, string 或 failuv_fs_t userdata路径:字符串callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilrmdir(2)。boolean 或 failuv_fs_t userdata路径:字符串callback: callableerr: nil 或 字符串success: uv_fs_t userdata 或 nilscandir(3),但 API 稍有不同。返回一个句柄,用户可以将其传递给 uv.fs_scandir_next()。uv_fs_t userdata 或 failfs: uv_fs_t userdatastring, string 或 nil 或 fail路径:字符串callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串stat: table 或 nil(见下文)stat(2)。table 或 faildev : integermode : integernlink : integeruid : integergid : integerrdev : integerino : integersize : integerblksize : integerblocks : integerflags : integergen : integeratime : tablesec : integernsec : integermtime : tablesec : integernsec : integerctime : tablesec : integernsec : integerbirthtime : tablesec : integernsec : integertype : stringuv_fs_t userdatafd: 整数callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串stat: table 或 nil(见 uv.fs_stat)fstat(2)。table 或 fail(见 uv.fs_stat)uv_fs_t userdata路径:字符串callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串stat: table 或 nil(见 uv.fs_stat)lstat(2)。uv_fs_t userdata路径:字符串new_path: stringcallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilrename(2)。boolean 或 failuv_fs_t userdatafd: 整数callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilfsync(2)。boolean 或 failuv_fs_t userdatafd: 整数callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilfdatasync(2)。boolean 或 failuv_fs_t userdatafd: 整数offset: integercallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilftruncate(2)。boolean 或 failuv_fs_t userdataout_fd: 整数in_fd: 整数in_offset: 整数size: integercallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串bytes: integer 或 nilsendfile(2) 的有限等效。返回写入的字节数。integer 或 failuv_fs_t userdata路径:字符串mode: integercallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串permission: 布尔值 或 nilaccess(2)。Windows 使用 GetFileAttributesW()。访问 mode 可以是整数,也可以是包含 "R" 或 "W" 或 "X" 的字符串。返回 true 或 false 表示访问权限。boolean 或 failuv_fs_t userdata路径:字符串mode: integercallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilchmod(2)。boolean 或 failuv_fs_t userdatafd: 整数mode: integercallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilfchmod(2)。boolean 或 failuv_fs_t userdata路径:字符串atime: 数字mtime: 数字callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilutime(2)。boolean 或 failuv_fs_t userdatafd: 整数atime: 数字mtime: 数字callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilfutime(2)。boolean 或 failuv_fs_t userdata路径:字符串atime: 数字mtime: 数字callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nillutime(2)。boolean 或 failuv_fs_t userdata路径:字符串new_path: stringcallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nillink(2)。boolean 或 failuv_fs_t userdata路径:字符串new_path: stringflags: 表, 整数, 或 nildir: 布尔值junction: 布尔值callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilsymlink(2)。如果省略 flags 参数,则第三个参数将被视为 callback。boolean 或 failuv_fs_t userdata路径:字符串callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串path: string 或 nilreadlink(2)。string 或 failuv_fs_t userdata路径:字符串callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串path: string 或 nilrealpath(3)。string 或 failuv_fs_t userdata路径:字符串uid: 整数gid: 整数callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilchown(2)。boolean 或 failuv_fs_t userdatafd: 整数uid: 整数gid: 整数callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilfchown(2)。boolean 或 failuv_fs_t userdatafd: 整数uid: 整数gid: 整数callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nillchown(2)。boolean 或 failuv_fs_t userdata路径:字符串new_path: stringflags: 表, 整数, 或 nilexcl: 布尔值ficlone: 布尔值ficlone_force: 布尔值callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilflags 参数,则第三个参数将被视为 callback。boolean 或 failuv_fs_t userdata路径:字符串callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串dir: luv_dir_t userdata 或 nilentries: 整数 或 nilluv_dir_t userdata 或 failuv_fs_t userdatadir:readdir([callback])dir: luv_dir_t userdatacallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串entries: 表 或 nil(见下文)luv_dir_t。返回一个数据表的表,其中条目数 n 等于或小于与关联的 uv.fs_opendir() 调用中使用的 entries 参数。table 或 fail[1, 2, 3, ..., n] : 表name : 字符串type : stringuv_fs_t userdatadir:closedir([callback])dir: luv_dir_t userdatacallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串success: boolean 或 nilboolean 或 failuv_fs_t userdata路径:字符串callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串表 或 nil(见下文)statfs(2)。表 或 niltype : 整数bsize : 整数blocks : integerbfree : 整数bavail : 整数files : 整数ffree : 整数getaddrinfo 和 getnameinfo 请求。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"work_callback: 函数 或 字符串...: 传递给/来自 uv.queue_work(work_ctx, ...) 的 threadargsafter_work_callback: 函数...: 从 work_callback 返回的 threadargsluv_work_ctx_t(不是 uv_work_t)。work_callback 是一个 Lua 函数或一个包含 Lua 代码或从函数转储的字节码的字符串。返回包装它的 Lua 用户数据。luv_work_ctx_t userdatawork_ctx:queue(...)work_ctx: luv_work_ctx_t userdata...: threadargs... 的任何附加参数在一个新的 Lua 状态中运行 work_callback。从 work_callback 返回的值将传递给 after_work_callback,后者在主循环线程中调用。boolean 或 failhost: 字符串 或 nilservice: 字符串 或 nilhints: 表 或 nilfamily: 字符串 或 整数 或 nilsocktype: 字符串 或 整数 或 nilprotocol: 字符串 或 整数 或 niladdrconfig: 布尔值 或 nilv4mapped: 布尔值 或 nilall: 布尔值 或 nilnumerichost: 布尔值 或 nilpassive: 布尔值 或 nilnumericserv: 布尔值 或 nilcanonname: 布尔值 或 nilcallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串addresses: 表 或 nil(见下文)getaddrinfo(3)。node 或 service 可以是 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" 等)table 或 fail[1, 2, 3, ..., n] : 表addr : 字符串family : stringport : 整数 或 nilsocktype : 字符串protocol : 字符串canonname : 字符串 或 niluv_getaddrinfo_t userdata 或 failaddress: 表ip: 字符串 或 nilport: 整数 或 nilfamily: 字符串 或 整数 或 nilcallback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串host: 字符串 或 nilservice: 字符串 或 nilgetnameinfo(3)。family 必须是以下之一:"unix"、"inet"、"inet6"、"ipx"、"netlink"、"x25"、"ax25"、"atmpvc"、"appletalk" 或 "packet"。字符串, 字符串 或 failuv_getnameinfo_t userdata 或 failoptions: 表 或 nilstack_size: 整数 或 nilentry: 函数 或 字符串...: 传递给 entry 的 threadargsluv_thread_t(不是 uv_thread_t)。返回包装它的 Lua 用户数据并异步执行 entry,它可以是 Lua 函数,也可以是包含 Lua 代码或从函数转储的字节码的字符串。附加参数 ... 将传递给 entry 函数,并且可以提供可选的 options 表。当前接受的 option 字段是 stack_size。luv_thread_t userdata 或 failthread:equal(other_thread)thread: luv_thread_t userdataother_thread: luv_thread_t userdata__eq 元方法。thread:setaffinity(affinity, [get_old_affinity])thread: luv_thread_t userdataaffinity: 表[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_affinity 为 true,则将返回 thread 的先前关联性设置。否则,成功调用后将返回 true。table 或 boolean 或 fail[1, 2, 3, ..., n] : 布尔值thread:setaffinity(affinity [, get_old_affinity])thread: luv_thread_t userdataaffinity: tableget_old_affinity: booleanget_old_affinity 为 true,则将返回 thread 的先前关联性设置。否则,成功调用后将返回 true。table 或 失败[1, 2, 3, ..., n] : 布尔值thread:getaffinity([mask_size])mask_size: integerinteger 或 failmask_size,它必须大于或等于 uv.cpumask_size()。如果省略了 mask_size 参数,则将使用 uv.cpumask_size() 的返回值。返回一个类似数组的表,其中每个键都对应一个 CPU 编号,值是布尔值,表示该 thread 是否有资格在该 CPU 上运行。thread: luv_thread_t userdata获取调用线程正在运行的 CPU 编号。
注意: 第一个 CPU 将返回为编号 1,而不是 0。这允许编号与 uv.thread_getaffinity 和 uv.thread_setaffinity 中使用的表键相对应。
uv.thread_setpriority({thread}, {priority}) uv.thread.setpriority()
> 方法形式 thread:setpriority(priority)
priority: number
boolean 或 failthread: luv_thread_t userdatathread:getpriority()thread: luv_thread_t userdatanumber 或 failboolean 或 failluv_thread_t{entry} [, {args}]) uv.thread_create()entry: functionargs: tablestring 或 失败entry 参数必须是一个函数,它将作为新线程的入口点运行。args 参数是一个表,它将作为参数传递给 entry 函数。entry 函数不应返回任何内容,并且应以 uv.thread_exit() 退出。返回一个新的 luv_thread_t 句柄,该句柄标识新创建的线程。{retval}) uv.thread_exit()string 或 失败retval: anyuv.thread_create() 创建的线程中的入口点函数调用。可选的 retval 参数将被传递回 uv.thread_join()。{thread}) uv.thread_join()0 或 failthread:join()thread 完成执行其入口函数。string 或 失败msec: integer0 或 failcwd: stringcwd 设置当前工作目录。{title}) uv.set_process_title()integer 或 failtitle: stringtitle 设置当前进程的标题。table 或 失败sec : integernumbersec : integeruv.get_free_memory() 不同,因为它考虑了操作系统施加的任何限制。如果不存在此类限制,或者限制未知,则返回的量将与 uv.get_free_memory() 相同。utime : table(用户 CPU 时间使用量)usec : integerstime : table(系统 CPU 时间使用量)maxrss : integer(最大驻留集大小)ixrss : integer(积分共享内存大小)idrss : integer(积分非共享数据大小)isrss : integer(积分非共享堆栈大小)minflt : integer(页面回收(软页面错误))majflt : integer(页面错误(硬页面错误))integernswap : integer(交换)inblock : integer(块输入操作)table 或 失败[1, 2, 3, ..., n] : 表oublock : integer(块输出操作)msgsnd : integer(发送的 IPC 消息)msgrcv : integer(接收的 IPC 消息)nsignals : integer(接收的信号)nvcsw : integer(自愿上下文切换)nivcsw : integer(非自愿上下文切换)integer 或 failmodel : stringintegerspeed : numbertimes : tableuser : numberintegerspeed : numbernice : numbersys : numberidle : numberspeed : numberirq : numbersys : numberspeed : numberENOTSUP。id: integerid 设置进程的用户 ID。id 设置进程的组 ID。clock_id: stringclock_id 可以是字符串 "monotonic" 或 "realtime"。fd: 整数stringsec: integerinteger, integer 或 failnsec: integerip : stringfamily : string[flags] handle-type handle-address 。标志是 R 表示引用、A 表示活动和 I 表示内部。{fd}) uv.guess_handle()string 或 失败fd 一起使用哪种类型的流。通常,这将在初始化期间使用,以猜测 stdio 流的类型。string 或 失败number, number, numbersysname : stringrelease : stringversion : stringmachine : stringstringname: stringsize: integer (默认 = LUAL_BUFFERSIZE)name 指定的环境变量,以字符串形式表示。可以通过定义 size 来设置内部缓冲区大小。如果省略,则使用 LUAL_BUFFERSIZE。如果环境变量超过内部缓冲区中可用的存储空间,则返回 ENOBUFS。如果不存在匹配的环境变量,则返回 ENOENT。string 或 失败name: stringvalue: stringvalue 设置由 name 指定的环境变量。boolean 或 failname: stringname 指定的环境变量。boolean 或 failstring 或 失败string 或 失败username : stringuid : integergid : integershell : stringhomedir : stringpid:整数pid 指定的进程的调度优先级。pid:整数priority: integerpid 指定的进程的调度优先级。priority 范围在 -20(高优先级)和 19(低优先级)之间。boolean 或 faillen: integerflags: nil (见下文)callback: callable(异步版本)或 nil(同步版本)err: nil 或 字符串bytes: string 或 nillen 的字符串。flags 预留供将来扩展使用,目前必须为 nil 或 0 或 {}。len 时,会返回一个非零错误值或传递给回调。如果省略回调,则此函数将同步完成。string 或 fail0 或 failerrcode: integererr 和 name):Unix 上的 POSIX 错误代码(存储在 errno 中的代码)和 Windows 上的 Win32 错误代码(由 GetLastError() 或 WSAGetLastError() 返回的代码)。string, string 或 nilepoll_wait)中处于空闲状态的时间量。此调用是线程安全的。"metrics_idle_time" 调用 loop_configure 之前,事件循环不会开始累积事件提供程序的空闲时间。loop_count : integerevents : integerevents_waiting : integer