Handling POSIX Signals

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
Before you make a thread asking for help, read this.
Post Reply
jdoolin
Prole
Posts: 31
Joined: Sat Nov 18, 2017 7:40 pm

Handling POSIX Signals

Post by jdoolin » Sat Jan 16, 2021 5:31 pm

Is it possible to handle POSIX signals in Love2D? Such as SIGSTOP, SIGCONT, SIGTERM, etc?

I've seen a luaposix library, but I'm still not sure how I'd incorporate it into Love2D's callbacks.

User avatar
pgimeno
Party member
Posts: 2483
Joined: Sun Oct 18, 2015 2:58 pm

Re: Handling POSIX Signals

Post by pgimeno » Sat Jan 16, 2021 6:18 pm

You can install and require luaposix, then just call its functions. Distribution is going to be a problem, though, as binary libraries need to be included for all POSIX platforms you intend to support. But if it's for your own use, no problem.

jdoolin
Prole
Posts: 31
Joined: Sat Nov 18, 2017 7:40 pm

Re: Handling POSIX Signals

Post by jdoolin » Sat Jan 16, 2021 8:37 pm

pgimeno wrote:
Sat Jan 16, 2021 6:18 pm
You can install and require luaposix, then just call its functions. Distribution is going to be a problem, though, as binary libraries need to be included for all POSIX platforms you intend to support. But if it's for your own use, no problem.
Technically, the POSIX requirement is only for one platform, so I'd only need to build one binary library. How does one include and distribute those compiled libraries in the love project?

I'm also not clear on how I would get the game to receive the signal or register the handle. I try the code below and send the STOP signal with the kill command, but nothing happens. It just... well, stops just like it would when pressing ctrl-z.

Code: Select all

function pause(signo)
    print("Pause")
end

function love.load()
    M = require 'posix.signal'
    M.signal(SIGSTOP, pause)
end

User avatar
pgimeno
Party member
Posts: 2483
Joined: Sun Oct 18, 2015 2:58 pm

Re: Handling POSIX Signals

Post by pgimeno » Sun Jan 17, 2021 2:59 am

jdoolin wrote:
Sat Jan 16, 2021 8:37 pm
Technically, the POSIX requirement is only for one platform, so I'd only need to build one binary library.
For which platform? Linux? Android? MacOS? iOS? All four can handle POSIX signals. Basically, all the platforms Löve supports except Windows.

jdoolin wrote:
Sat Jan 16, 2021 8:37 pm
How does one include and distribute those compiled libraries in the love project?
For Linux, they need to be available somewhere in package.cpath, and if they are inside a .love file, be copied to the save directory then loaded from there. For the other systems, I don't know.

jdoolin wrote:
Sat Jan 16, 2021 8:37 pm
I'm also not clear on how I would get the game to receive the signal or register the handle. I try the code below and send the STOP signal with the kill command, but nothing happens. It just... well, stops just like it would when pressing ctrl-z.
From signal(7): "The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored". If I trap SIGCONT and interrupt, then resume, it prints "Pause".

User avatar
slime
Solid Snayke
Posts: 2923
Joined: Mon Aug 23, 2010 6:45 am
Location: Nova Scotia, Canada
Contact:

Re: Handling POSIX Signals

Post by slime » Sun Jan 17, 2021 5:35 am

What do you plan to use it for? Does the love.quit callback at least partially cover your use case?

jdoolin
Prole
Posts: 31
Joined: Sat Nov 18, 2017 7:40 pm

Re: Handling POSIX Signals

Post by jdoolin » Sun Jan 17, 2021 5:21 pm

I'm under NDA and not sure if I can go into detail other than to say that it has been recommended, though not explicitly required, that my project be able to handle SIGSTOP, SIGCONT and SIGTERM.

However, I think in my case I may be able to go without handling those.
pgimeno wrote:
Sun Jan 17, 2021 2:59 am
For which platform? Linux? Android? MacOS? iOS? All four can handle POSIX signals. Basically, all the platforms Löve supports except Windows.
This is a Linux platform.
jdoolin wrote:
Sat Jan 16, 2021 8:37 pm
For Linux, they need to be available somewhere in package.cpath, and if they are inside a .love file, be copied to the save directory then loaded from there.
By save directory, you mean what would normally be ~/.love/game_id/ ?
jdoolin wrote:
Sat Jan 16, 2021 8:37 pm
From signal(7): "The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored". If I trap SIGCONT and interrupt, then resume, it prints "Pause".
Are you saying you tried the code sample with SIGCONT and it worked for you? I'll give that a try. Even though I may not need to worry abou this now, I'm still pretty curious.

Thanks for the help folks!

User avatar
pgimeno
Party member
Posts: 2483
Joined: Sun Oct 18, 2015 2:58 pm

Re: Handling POSIX Signals

Post by pgimeno » Sun Jan 17, 2021 6:05 pm

jdoolin wrote:
Sun Jan 17, 2021 5:21 pm
By save directory, you mean what would normally be ~/.love/game_id/ ?
I mean whatever love.filesystem.getSaveDirectory() returns, or any subdirectory inside that. I think it defaults to ~/.local/share/love/game_id/ on Linux.

Note I haven't tried this, I've just seen it mentioned in this forum at some point.

jdoolin wrote:
Sun Jan 17, 2021 5:21 pm
Are you saying you tried the code sample with SIGCONT and it worked for you? I'll give that a try. Even though I may not need to worry abou this now, I'm still pretty curious.
Indeed, just changing your example to use SIGCONT instead of SIGSTOP:

Code: Select all

$ love11 .
^Z
[1]+  Stopped                 love11 .
$ fg
love11 .
Pause
$ 
"Pause" is printed by the handler.

Note SIGTSTP can also be handled, and that's the one received when you issue a ^Z. I've also tried handling it and it works.

Post Reply

Who is online

Users browsing this forum: No registered users and 46 guests