Exit in Lua

Here’s an idiomatic Lua example demonstrating the concept of exiting a program:

local function cleanup()
  print("Cleanup function called")
end

-- Register the cleanup function
local ok, msg = pcall(function()
  -- This will be called when the script exits normally
  -- or when os.exit() is called without the 'true' parameter
  debug.setexitfunc(cleanup)
end)

if not ok then
  print("Could not set exit function: " .. msg)
end

print("Starting the program")

-- Simulate some work
for i = 1, 3 do
  print("Working... " .. i)
end

-- Exit the program with status code 3
print("Exiting with status 3")
os.exit(3, true)

-- This line will never be executed
print("This will not be printed")

This Lua script demonstrates how to exit a program and handle cleanup operations. Here’s an explanation of the code:

  1. We define a cleanup function that simulates some cleanup operation.

  2. We use debug.setexitfunc() to register the cleanup function. This function will be called when the script exits normally or when os.exit() is called without the true parameter.

  3. We wrap the debug.setexitfunc() call in a pcall() to handle any errors, as this function might not be available in all Lua environments.

  4. The script then simulates some work with a simple loop.

  5. Finally, we use os.exit(3, true) to exit the program with a status code of 3. The true parameter tells Lua to exit immediately without calling the cleanup function or running any pending finalizers.

To run this script:

  1. Save the code in a file named exit_example.lua.
  2. Open a terminal and navigate to the directory containing the file.
  3. Run the script using the Lua interpreter:
$ lua exit_example.lua
Starting the program
Working... 1
Working... 2
Working... 3
Exiting with status 3

To check the exit status in a shell:

$ lua exit_example.lua
$ echo $?
3

Note that the cleanup function is not called when we use os.exit(3, true). If you want to ensure the cleanup function is called, you can either:

  1. Remove the true parameter from os.exit(3), or
  2. Call the cleanup function manually before exiting.

This example demonstrates how Lua handles program termination and allows for custom exit behavior. Unlike some other languages, Lua doesn’t use the return value from the main chunk to indicate the exit status. Instead, it provides the os.exit() function for this purpose.

Remember that the availability and behavior of os.exit() and debug.setexitfunc() may vary depending on the Lua implementation and host environment you’re using.