process
process 模块提供了子进程管理功能,用于创建、控制和与外部进程通信。这是 os.exec
和 os.execv
函数的底层模块。这是 xmake 的扩展模块。
提示
使用此模块需要先导入:import("core.base.process")
process.open
- 使用命令字符串打开子进程
lua
import("core.base.process")
local proc = process.open(command, opt)
通过执行命令字符串创建新的子进程。返回一个子进程对象,可用于控制和与进程通信。
参数:
command
- 必需。要执行的命令字符串opt
- 可选。进程选项表
opt
中的选项:
stdin
- 输入源(文件路径、文件对象或管道对象)stdout
- 输出目标(文件路径、文件对象或管道对象)stderr
- 错误输出目标(文件路径、文件对象或管道对象)envs
- 环境变量数组(例如:{"PATH=xxx", "XXX=yyy"}
)
lua
-- 基本进程执行
local proc = process.open("echo hello world")
local ok, status = proc:wait()
proc:close()
-- 带文件重定向的进程
local stdout = os.tmpfile()
local stderr = os.tmpfile()
local proc = process.open("xmake lua print 'hello'", {
stdout = stdout,
stderr = stderr
})
proc:wait()
proc:close()
-- 从文件读取输出
local output = io.readfile(stdout):trim()
print(output) -- 输出: hello
带环境变量的进程:
lua
local proc = process.open("echo $MY_VAR", {
envs = {"MY_VAR=hello from xmake"}
})
proc:wait()
proc:close()
process.openv
- 使用程序和参数列表打开子进程
lua
import("core.base.process")
local proc = process.openv(program, argv, opt)
通过执行程序和参数列表创建新的子进程。这比 process.open
更安全,因为它避免了 shell 解释问题。
参数:
program
- 必需。要执行的程序argv
- 必需。传递给程序的参数数组opt
- 可选。进程选项表(与process.open
相同)
lua
-- 使用参数执行程序
local proc = process.openv("xmake", {"lua", "print", "hello world"})
local ok, status = proc:wait()
proc:close()
-- 带文件重定向执行
local stdout = os.tmpfile()
local proc = process.openv("xmake", {"lua", "print", "xmake"}, {
stdout = stdout,
stderr = stderr
})
proc:wait()
proc:close()
-- 读取输出
local output = io.readfile(stdout):trim()
print(output) -- 输出: xmake
带环境变量执行:
lua
local proc = process.openv("env", {"MY_VAR=test"}, {
envs = {"MY_VAR=hello from xmake"}
})
proc:wait()
proc:close()
process:wait
- 等待子进程完成
lua
local ok, status = process:wait(timeout)
等待子进程完成并返回退出状态。可以带或不带超时使用。
参数:
timeout
- 可选。超时时间(毫秒)。使用 -1 表示无限等待,0 表示非阻塞
返回值:
ok
- 退出代码(0 表示成功,负数表示错误)status
- 进程状态或错误消息
lua
local proc = process.open("echo hello")
local ok, status = proc:wait()
print("退出代码:", ok) -- 输出: 0 (成功)
print("状态:", status) -- 输出: nil 或错误消息
proc:close()
带超时等待:
lua
local proc = process.open("sleep 10")
local ok, status = proc:wait(1000) -- 最多等待 1 秒
if ok < 0 then
print("进程超时或失败:", status)
end
proc:close()
非阻塞等待:
lua
local proc = process.open("echo hello")
local ok, status = proc:wait(0) -- 非阻塞
if ok < 0 then
print("进程尚未就绪")
else
print("进程完成,代码:", ok)
end
proc:close()
process:kill
- 终止子进程
lua
local success, error = process:kill()
立即终止子进程。成功返回 true,失败返回 false 和错误消息。
lua
local proc = process.open("sleep 60")
-- ... 做一些事情 ...
-- 终止进程
local success, error = proc:kill()
if success then
print("进程终止成功")
else
print("终止进程失败:", error)
end
proc:close()
终止长时间运行的进程:
lua
local proc = process.open("xmake l os.sleep 60000")
print("进程已启动:", proc)
-- 2 秒后终止
os.sleep(2000)
local success = proc:kill()
print("终止结果:", success)
proc:close()
process:close
- 关闭子进程
lua
local success = process:close()
关闭子进程并释放相关资源。完成进程操作后应调用此方法。
lua
local proc = process.open("echo hello")
proc:wait()
local success = proc:close()
print("关闭结果:", success)
始终关闭进程:
lua
local proc = process.open("some command")
local ok, status = proc:wait()
-- 即使进程失败也要关闭
proc:close()
process:name
- 获取进程名称
lua
local name = process:name()
返回进程的名称(不带路径的文件名)。
lua
local proc = process.open("xmake lua print 'hello'")
print("进程名称:", proc:name()) -- 输出: xmake
proc:close()
process:program
- 获取进程程序路径
lua
local program = process:program()
返回用于启动进程的完整程序路径。
lua
local proc = process.openv("xmake", {"lua", "print", "hello"})
print("程序:", proc:program()) -- 输出: xmake
proc:close()
process:cdata
- 获取进程 cdata
lua
local cdata = process:cdata()
返回进程的底层 cdata 对象。由调度器和其他低级操作内部使用。
lua
local proc = process.open("echo hello")
local cdata = proc:cdata()
print("CData 类型:", type(cdata))
proc:close()
process:otype
- 获取对象类型
lua
local type = process:otype()
返回对象类型标识符。对于子进程对象,返回 3(poller.OT_PROC)。
lua
local proc = process.open("echo hello")
print("对象类型:", proc:otype()) -- 输出: 3
proc:close()
提示
process 模块是 os.exec
和 os.execv
函数的底层实现。它提供了更多的控制和灵活性用于进程管理,包括超时处理、管道集成和调度器支持。使用 process.open
进行简单的命令执行,使用 process.openv
进行更安全的参数处理。