扩展 API

lua-users home
wiki

Lua 核心基于 C 语言及其标准库,因此,与 C 一样,它不提供对现代操作系统中存在的许多功能的访问。已经(并且一直)有几次尝试创建 Lua API,它提供对 C 中不存在的标准操作系统功能的访问。本页旨在引发关于哪些功能应被视为“标准”以及此类 Lua API 应该是什么样子的讨论。

虽然完整的 POSIX 绑定确实可以让 Lua 程序在许多平台上编写,但至少一个主要平台(Windows)会被排除在外。在 Windows 之上嫁接类似 POSIX 的 API 既不容易也不干净。

以下是已知库、API 和系统的简要列表和描述

此 API 旨在为当今流行的操作系统(Windows、MacOSX 和 POSIX 平台)上的独立 Lua 程序提供更完整的编程环境。

一个或多或少直接的 POSIX 绑定。

LuaFileSystem 提供了一种可移植的方式来访问底层目录结构和文件属性。

文件 I/O 和文件系统;串行通信;套接字;事件通知机制(最近添加了 IOCP);win32 内容:注册表、事件、服务;等等。

--

以下是 扩展提案 API 与 [lposix][LuaFileSystem] 的比较。

比较

环境

-- get environment variable
os.getenv           posix.getenv

-- set/unset environment variable
os.setenv           posix.putenv
                    posix.setenv
                    posix.unsetenv

-- sleep (pause without consuming CPU)
os.sleep            posix.sleep
--[[
    os.sleep specifies that the implementation provide sub-second
    resolution if available.  posix.sleep provides only second resolution.
--]]

-- system information
                    posix.ctermid
                    posix.errno
                    posix.pathconf
                    posix.sysconf
                    posix.ttyname
                    posix.uname

目录

-- get/set current directory
os.currentdir       posix.getcwd        lfs.currentdir
os.chdir            posix.chdir         lfs.chdir

-- create/delete directories
os.mkdir            posix.mkdir         lfs.mkdir
os.remove           posix.rmdir         lfs.rmdir
--[[
    In both "ex" and POSIX systems, os.remove() will remove any directory
    entry: both files (non-directories) and empty subdirectories.
    The Lua 5.1 reference says that the standard os.remove() function will
    remove a directory, but in fact the Microsoft MSVCRT implementation
    of the C remove() function (on which os.remove() is based) will not
    remove directories.
--]]

-- POSIX directory routines
                    posix.link
                    posix.unlink
                    posix.mkfifo
                    posix.readlink
                    posix.symlink

目录条目

-- list directory
os.dir              posix.files         lfs.dir
                    posix.dir

-- get file attributes
os.dirent           posix.stat          lfs.attributes
--[[
    The "ex" os.dir() iterator returns a table of directory entry
    attributes including the name, while the posix.files() and lfs.dir()
    iterators return entry names only.

    The best comparison of these three functions is via example:
--]]
  require"ex"
  for e in os.dir() do
    print(e.name, e.size)
  end

  require"lfs"
  for name in lfs.dir() do
    if name~="." and name~=".." then
      print(name, lfs.attributes(name).size)
    end
  end

  require"posix"
  for name in posix.files() do
    if name~="." and name~=".." then
      print(name, posix.stat(name, "size"))
    end
  end
--[[
    os.dir() elides any "." and ".." names while lfs.dir(),
    posix.dir() and posix.files() include them.
    
    posix.dir() is not an iterator; it returns a table with all entry names.
--]]

-- set file attributes
                    posix.utime         lfs.touch
                    posix.chmod
                    posix.chown
--[[
    The "ex" API says only that the os.dirent() table can be extended
    with OS-specific attribute values.  It would not be unreasonable
    to add file date information to the standard fields:
--]]
  local age = os.difftime(os.time(), e.modified)
  e.modified = os.time() -- touch a file

-- Check permissions
                    posix.access

文件 I/O

-- file locking
file:lock                               lfs.lock
file:unlock                             lfs.unlock

-- create anonymous pipe
io.pipe

进程控制

-- spawn process
os.spawn            posix.fork
proc:wait           posix.exec
                    posix.wait
--[[
    os.spawn supports redirection for standard I/O streams (in,
    out, err) while lposix does not provide full integration with
    POSIX-style descriptors and therefore does not provide a bind
    for the POSIX dup() interface.
--]]

-- signal a process
                    posix.kill

-- process information
                    posix.getprocessid
                    posix.getgroup
                    posix.getlogin
                    posix.getpasswd
                    posix.setgid
                    posix.setuid
                    posix.times
                    posix.umask

请注意,“ex” API 部分基于 LuaFileSystem,其实现使用了一些来自它的代码。

评论

扩展提案标准库http://luaforge.net/projects/stdlib/ 相比如何?-- DavidManura

标准库 似乎是一组用纯 Lua 编写的模块。到目前为止,没有一个模块提供 C 中不存在的功能,而是提供了一组标准库以供重用。扩展 API 的结果可能应该作为 stdlib 的一部分。-- MarkEdgar

如果您现在需要扩展 API,您可以通过 LunaticPython 使用 Python 的 API

> py = require "python"
> os = py.import("os")
> =os.listdir('.')
['lua.exe', 'lua51.dll', 'luac.exe']
--DavidManura

最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2010 年 9 月 18 日下午 5:40 GMT (差异)