Программа Lua-Love не закрывает устройства, как я ожидаю

У меня есть программа любви lua:

conf-nogui.lua (вызывается внутри conf.lua, чтобы не отображать графический интерфейс):

function love.conf(t)
  print("Switch GUI window off")
  t.window = nil
end

main.lua:

-- UDP Server
local socket = require("socket")
require("utils")
require("globals")

-- Module Scoped Variables (or as I like to call them local-globals)
local udp

-- Startup
function love.load()
  print("load")
  udp = socket.udp()
  udp:setsockname("*", SERVER_PORT)
  udp:settimeout(0)
  print("load done")
end

-- Scheduler 
function love.update()
  -- Check for Rx packets
  local rxDataPacket, ip, port = udp:receivefrom()
  if rxDataPacket then
    -- print the packet as hex
    printStringAsHex("Rx from " .. ip .. ":" .. port .. " ", rxDataPacket)    
    -- Turn string into an array for editing
    local rxByteArray = stringToArray(rxDataPacket)
    -- Edit values
    rxByteArray[5] = 0x66 
    -- Turn back into string
    local txDataPacket = arrayToString(rxByteArray)  
    -- Reply with the result
    udp:sendto(txDataPacket, ip, port)
  end
end

-- shutdown
function love.quit()
  print("Closing connection...")
  -- done with client, close the object
  udp:close()
  print("connection close done")
end

Есть некоторые другие файлы, которые включены, но я не думаю, что они необходимы для этого вопроса.

Я запускаю программу в командной строке следующим образом: love . --console Я нахожусь в правильном каталоге, поэтому "." текущий реж.

Эта маленькая программа работает точно так, как ожидалось, пока я ее не закрою. Он работает в командной строке Windows, поэтому я использую Ctrl + C для завершения программы (она не работает с графическим интерфейсом - см. файл conf).

Когда программа закрывается, это то, что я вижу в командной строке:

AL lib: (EE) alc_cleanup: 1 device not closed

Так что я не понимаю, почему мой function love.quit() не называется. Я не вижу свою отладку Closing connection.... Это потому, что ctrl+C слишком "жестко" завершает программу? - есть ли другой способ завершить программу?


person code_fodder    schedule 17.08.2016    source источник


Ответы (1)


Мне кажется, что love.quit вызывается только тогда, когда возникает событие quit (т.е. love.event.quit())

При нажатии Ctrl+c cmd получает SIGINT, что приводит к остановке текущих программ, запущенных в экземпляре.

Что технически происходит, когда вы нажимаете Control-C, так это то, что все программы, работающие на переднем плане в вашем текущем терминале (или виртуальном терминале), получают отправленный сигнал SIGINT.1

Итак, я предполагаю, что LOVE перехватывает этот вход и не выбирает событие quit, а вместо этого принудительно отключается.

Проверьте это вопрос для получения дополнительной помощи.

person Liam Mueller    schedule 17.08.2016
comment
хм.... блин, этого я и опасался. Я надеялся, что структура любви как-то справится с этим. Вы знаете, как я могу обрабатывать SIGINT в lua? - person code_fodder; 17.08.2016
comment
хорошо, спасибо - я понял это из вашего первого поста, что я хочу знать, как с этим справиться или как правильно завершить программу - имея в виду, что у меня нет графического интерфейса... Я попытался прочитать стандартный ввод, но это появляется быть блокирующим вызовом, и я не хочу, чтобы моя программа блокировалась. - person code_fodder; 17.08.2016
comment
@code_fodder Насколько я могу судить, нет способа, по крайней мере, без редактирования файлов C LOVE и переписывания их поведения при обнаружении SIGINT. - person Liam Mueller; 17.08.2016
comment
хорошо, справедливо. Для меня это не большая проблема, так как кажется, что мусор все равно собирается :) Спасибо за информацию. - person code_fodder; 17.08.2016