Skip to content

signal

2.9.1 adds a new signal registration interface. We can register signal processing functions such as SIGINT in the Lua layer to customize the response logic.

signal.register

  • Register signal handler

Currently, it only supports SIGINT signal processing, and it also supports mainstream platforms such as windows.

lua
import("core.base.signal")

function main()
     signal.register(signal.SIGINT, function (signo)
         print("signal.SIGINT(%d)", signo)
     end)
     io.read()
end

This is useful when some sub-processes internally shield SIGINT, causing them to freeze and not exit. Even if the user presses Ctrl+C to exit the xmake process, it does not exit. We can force it out in this way.

lua
import("core.base.process")
import("core.base.signal")

function main()
     local proc
     signal.register(signal.SIGINT, function (signo)
         print("sigint")
         if proc then
             proc:kill()
         end
     end)
     proc = process.open("./trap.sh")
     if proc then
         proc:wait()
         proc:close()
     end
end

For the background of this issue, please refer to: #4889

signal.ignore

  • Ignore a signal

We can also ignore the processing of blocking a certain signal through the signal.ignore interface.

lua
signal.ignore(signal.SIGINT)

signal.reset

  • Reset a signal

We can also clear the processing function of a certain signal and fall back to the default processing logic.

lua
signal.reset(signal.SIGINT)