Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无限循环中的Lua:os.execute(“sleep n”)不能被^C停止_Lua_Signals_Posix - Fatal编程技术网

无限循环中的Lua:os.execute(“sleep n”)不能被^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

在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.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的规则。谢谢您的详细回答!虽然你没有提供解决方案,但我会接受这篇文章,因为它能更好地回答我的问题。谢谢你详细的回答!虽然你没有提供解决方案,但我会接受这篇文章,因为它能更好地回答我的问题。