微信号:gh_8590062d6d9b

介绍:原创/翻译的编程小知识, 目标是每篇文章只需一分钟时间阅读, 利用碎片时间学习技术

在 Lua 中实现 sleep 函数

2016-09-05 22:46 Yu Hao

作为一个超级精简的语言, Lua 几乎不提供任何 C89 标准所无法支持的功能, 因为那样就不能保证 Lua 的可移植性了。

作为代价, 很多其他语言中天然支持的功能却不能在 Lua 中找到语言或标准库的直接支持。 其中一个就是 sleep 功能。 Unix 系统是有 sleep 的系统调用的, 但非 Unix 系统却不能保证提供。

不过有一个巧妙的方式实现 sleep 功能(不过还是不通用)。 在 Unix 系统中:

function sleep(n)
  os.execute("sleep " .. tonumber(n))
end

利用执行 shell 的 sleep 命令来间接实现其功能。

而 Windows 下, 可以用另一个巧妙的方式:

function sleep(n)
  if n > 0 then 
    os.execute("ping -n " .. tonumber(n+1) .. " localhost > NUL")
  end
end

利用 ping 命令的 -n 参数来实现。

最后, 上面实现的 sleep 命令都只能做到秒一级的精度。如果有 socket 库, 可以实现更高的精度:

require "socket"

function sleep(sec)
    socket.select(nil, nil, sec)
end
sleep(0.2)

其实在 Unix 中, C 代码中利用 select 调用来实现比秒更高精度的 sleep 功能也很常见, 因为这种代码具有高可移植性。


"阅读原文"指向 Stack Overflow 上的同问题, 是我回答的。

 
一分钟的编程知识 更多文章 为什么在 Stack Overflow 回答问题 快讯: Vim 8.0 已发布! 复制特定文件及其相关文件结构 让你的 man 变得更漂亮 为什么 Vim 使用 hjkl 作方向键
猜您喜欢 这样的产品经理绝了,特别是最后一点! 程序员为什么要时刻保持危机感? MySQL for update 死锁案例 你哭着对我说,做网赚都是骗人的…… 【第1章第124回】HTML5格式问题,你遇到了吗?