Linux下如何在Lua中获取C程序的返回值?
Lua获取C程序返回值的问题与解决方法
问题描述
我编写了一个返回值为111或222的C程序,在Linux终端执行~/c-program; echo $?或分两次执行时,能正确输出程序返回值。但通过Lua脚本使用io.popen执行该程序并尝试获取返回值时,无法匹配预期值,执行逻辑进入错误分支且无法输出返回值内容。已测试基础逻辑语法无问题,现需解决如何在Lua中正确获取该C程序的返回值并作为变量使用。
C程序片段
if (stat == NULL) { system("echo \"stat is NULL\""); return 111; } else { system("echo \"stat is NOT NULL\""); return 222; }
原Lua脚本片段
local foo = io.popen(~/c-program; echo $?) local bar = foo:read("*a") foo:close() if (tonumber(bar) == 111) then os.execute("echo 111") elseif (tonumber(bar) == 222) then os.execute("echo 222") else os.execute("echo \"something is wrong\"") os.execute("echo "..bar) end
问题原因
io.popen的命令参数未用引号包裹,属于语法错误,Lua无法正确解析该命令。- C程序中通过
system("echo ...")输出的内容会混入io.popen读取的标准输出中,导致bar包含多余文本(如stat is NULL\n111\n),tonumber(bar)无法正确转换为数字。
解决方法
方法一:使用os.execute直接获取返回值
os.execute执行命令后会返回三个值:执行成功标记、退出状态类型、程序退出码。可以直接拿到C程序的返回值,代码示例:
local success, exit_type, exit_code = os.execute("~/c-program") if exit_code == 111 then os.execute("echo 111") elseif exit_code == 222 then os.execute("echo 222") else os.execute("echo \"something is wrong\"") os.execute("echo " .. exit_code) end
方法二:修正io.popen命令,过滤多余输出
如果必须使用io.popen,需要将C程序的标准输出和错误输出重定向到/dev/null,只保留返回值的输出,同时处理掉多余的换行符:
-- 重定向程序输出到/dev/null,仅获取返回值 local foo = io.popen("~/c-program > /dev/null 2>&1; echo $?") local bar = foo:read("*a") foo:close() -- 移除所有空白字符(包括换行、空格) bar = bar:gsub("%s+", "") local exit_code = tonumber(bar) if exit_code == 111 then os.execute("echo 111") elseif exit_code == 222 then os.execute("echo 222") else os.execute("echo \"something is wrong\"") os.execute("echo " .. exit_code) end
内容的提问来源于stack exchange,提问作者Popsicle
相关产品推荐
相关产品推荐

