## signal.lua

    #! /usr/bin/env lua

    local M = require 'posix.signal'

    local unistd = require 'posix.unistd'
    local syswait = require 'posix.sys.wait'

    local function go(fn, ...)
       local childpid = unistd.fork()
       if childpid == 0 then -- run function as child
          unistd._exit(fn(...) or 0)
       else
          return childpid
       end
    end

    local verbose = #arg > 0

    local function sleepx(secs)
       while true do
          secs = unistd.sleep(secs)
          if verbose then
             print('sleep', secs)
          end
          if secs == 0 then
             return
          end
       end
    end

    local nchild, nsig = 0, 0

    M.signal(M.SIGCHLD, function()
       local pid, status, code = syswait.wait(-1, syswait.WNOHANG)
       while pid do
          if pid ~= 0 then
             if verbose then
                print('wait', pid, status, code)
             end
             nchild = nchild + 1
          end
          pid, status, code = syswait.wait(-1, syswait.WNOHANG)
       end
    end)

    local function handler(signo)
       if verbose then
          print('handled', signo)
       end
       nsig = nsig + 1
    end

    M.signal(M.SIGUSR1, handler)
    M.signal(M.SIGUSR2, handler)
    M.signal(60, handler)

    local function killp(nsig)
       return M.kill(unistd.getppid(), nsig)
    end

    c1 = go(function() unistd.sleep(1); killp(M.SIGUSR1); killp(M.SIGUSR2) end)
    c2 = go(function() unistd.sleep(2); killp(M.SIGUSR2); end)
    c3 = go(function() unistd.sleep(2); killp(M.SIGUSR1) end)

    sleepx(3)

    if verbose then
       print('children', nchild, 'signals', nsig)
    else
       assert(nchild == 3)
       assert(nsig ==   4)
       print '+++ tests OK +++'
    end

generated by LDoc 1.5.0 Last updated 2025-02-16 13:16:41