无限循环中的Lua:os.execute(“sleep n”)不能被^C停止
在Lua5.2.4中,当在无限循环中使用广泛使用的os.execute'sleep n'方法时,^C Ctrl-C无法停止程序 最简单的例子:无限循环中的Lua:os.execute(“sleep n”)不能被^C停止,lua,signals,posix,Lua,Signals,Posix,在Lua5.2.4中,当在无限循环中使用广泛使用的os.execute'sleep n'方法时,^C Ctrl-C无法停止程序 最简单的例子: while true do print("HELLO!") os.execute("sleep 3") end 我的问题是: 这是预期的行为吗?我猜程序从os.execute命令返回后会收到^C信号 有没有一种有效的睡眠方式 Control-c很可能被os.execute生成的shell捕获,而不是被Lua捕获。您需要查看os.exec
while true do
print("HELLO!")
os.execute("sleep 3")
end
我的问题是:
这是预期的行为吗?我猜程序从os.execute命令返回后会收到^C信号
有没有一种有效的睡眠方式
Control-c很可能被os.execute生成的shell捕获,而不是被Lua捕获。您需要查看os.execute返回的代码。当命令正常结束时,os.execute返回true、exit、rc。否则,它返回nil等。当它被control-c中断时,它在我的机器中返回nil,信号,2 总之,请尝试以下代码:
while true do
print("HELLO!")
if not os.execute("sleep 3") then break end
end
Control-c很可能被os.execute生成的shell捕获,而不是被Lua捕获。您需要查看os.execute返回的代码。当命令正常结束时,os.execute返回true、exit、rc。否则,它返回nil等。当它被control-c中断时,它在我的机器中返回nil,信号,2 总之,请尝试以下代码:
while true do
print("HELLO!")
if not os.execute("sleep 3") then break end
end
简短回答
您的睡眠子对象将被终端的SIGINT杀死,但os.execute忽略该信号,因此lua将继续其循环
更长的答案
终端驱动程序将Ctrl+C转换为为为前台进程组生成的SIGINT,该进程组至少包括lua进程及其子睡眠进程
当lua脚本位于os.execute内时,极有可能生成此信号,因为脚本大部分时间都在os.execute内
当这种情况发生时,SIGINT会立即终止睡眠过程。然而,lua过程忽略该信号
它忽略SIGINT,因为os.execute是传统库调用的包装器,如您所见:
此库调用具有非常特定的语义,包括忽略调用者中的SIGINT。简短回答
您的睡眠子对象将被终端的SIGINT杀死,但os.execute忽略该信号,因此lua将继续其循环
更长的答案
终端驱动程序将Ctrl+C转换为为为前台进程组生成的SIGINT,该进程组至少包括lua进程及其子睡眠进程
当lua脚本位于os.execute内时,极有可能生成此信号,因为脚本大部分时间都在os.execute内
当这种情况发生时,SIGINT会立即终止睡眠过程。然而,lua过程忽略该信号
它忽略SIGINT,因为os.execute是传统库调用的包装器,如您所见:
此库调用具有非常特定的语义,包括忽略调用者中的SIGINT。有很多解决睡眠问题的替代方案在我的机器上有很多解决睡眠问题的替代方案它只返回2,但显式检查true对我有效。谢谢我接受了皮尔克罗的回答,因为它更接近地回答了我的问题。我想这更符合stackexchange的规则。在我的机器上,它只返回2,但对true的显式检查对我有效。谢谢我接受了皮尔克罗的回答,因为它更接近地回答了我的问题。我想这更符合stackexchange的规则。谢谢您的详细回答!虽然你没有提供解决方案,但我会接受这篇文章,因为它能更好地回答我的问题。谢谢你详细的回答!虽然你没有提供解决方案,但我会接受这篇文章,因为它能更好地回答我的问题。