【问题标题】:Infinity loop in io.popen function in lualua中io.popen函数中的无限循环
【发布时间】:2017-12-08 07:06:46
【问题描述】:

我想无限执行以下代码。 但是,如果连接了两个设备,则无限循环在第二次扫描部分冻结(第二次扫描部分意味着无限循环第二次开始并执行扫描命令)。为什么会出现这个问题?

while true do
print("Hi")
s = io.popen("iw wlan0 scan")
s:close()
print("Done")

dis = io.popen("iw wlan0 disconnect")
dis:close()

c = io.popen("iw wlan0 connect Name")
c:close()
print("Goes to Scan")
end

另外,如果我在命令行中手动输入命令(扫描 -> 断开连接 -> 连接 -> 扫描),那么扫描打印结果会在第二次扫描时自动重复 5 到 6 次。 (当我执行扫描命令时,打印结果是 SYNC - End of SCAN, restore to 20MHz channel 32, Total BSS[02] bImprovedScan ...... Resume for bImprovedScan, SCAN_PENDING ... ...... 并且此打印文本重复 5 到 6 次)。这种情况和这个问题有关系吗?

【问题讨论】:

  • 什么是“第二扫描部分”?打印输出是什么?停止是什么意思?它会因错误而冻结或中止还是什么?
  • 这是执行扫描命令时的打印输出。 SYNC - 扫描结束,恢复到 20MHz 通道 32,总 BSS[02]。
  • 停止意味着冻结。第二次扫描部分意味着无限循环第二次开始执行扫描命令。
  • 将此信息添加到您的问题中...请阅读How to Ask
  • 谢谢。我编辑了它。

标签: lua popen openwrt


【解决方案1】:

我不知道iw 命令的作用,但是使用管道而不从其中读取任何内容并在打开管道后立即关闭它会打开程序永远不会执行的可能性。

我建议使用os.execute 而不是io.popen

while true do
   print("Hi")
   os.execute("iw wlan0 scan; iw wlan0 disconnect; iw wlan0 connect Name")
   print("Goes to Scan")
end

【讨论】:

  • 谢谢你,当我第一次用 ctrl+c 打断时它才有效。你能教我这个问题吗?
  • s:close() 实际上是做什么的?它会终止正在运行的进程吗?
  • @EgorSkriptunoff,不,但我认为可以。 pclose 的手册页说:“pclose() 函数等待相关进程终止”。
  • @lhf - 它是尝试终止进程(通过发送信号)还是被动等待?
  • @EgorSkriptunoff, s:close 只是调用pclose
猜你喜欢
  • 2012-10-14
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
相关资源
最近更新 更多