Thread overview
How to catch a signal
Nov 09, 2019
W.Boeke
Nov 09, 2019
Dennis
Nov 09, 2019
W.Boeke
November 09, 2019
I am trying to catch a signal from the OS, as follows:

int winch;

void set_winch (int sig) {
  enum SIGWINCH = 28;
  signal.signal(SIGWINCH,cast(void function(int))set_winch);
  winch = sig;
}

The SIGWINCH signal notifies a window resize. In C this works (without the cast), but in D I get a compilation error:

Error: function signal.set_winch(int sig) is not callable using argument types ()
       missing argument for parameter #1: int sig

What should be the right way to accomplish this?
Thanks in advance for your answer.

Wouter

November 09, 2019
On Saturday, 9 November 2019 at 12:44:20 UTC, W.Boeke wrote:
> What should be the right way to accomplish this?

Put an ampersand before the function to get its address:
>   signal.signal(SIGWINCH,cast(void function(int)) &set_winch);

In C you can omit the & when taking a function address, but when you do that in D it tries to call the function and cast the return value of the function instead.
November 09, 2019
On Saturday, 9 November 2019 at 12:56:52 UTC, Dennis wrote:
>
> Put an ampersand before the function to get its address:
>>   signal.signal(SIGWINCH,cast(void function(int)) &set_winch);
>
> In C you can omit the & when taking a function address, but when you do that in D it tries to call the function and cast the return value of the function instead.

Bingo! That worked. The modified code is:

int winch;
extern(C) void set_winch(int sig) nothrow @nogc @system {
  enum SIGWINCH = 28;
  signal.signal(SIGWINCH,&set_winch);
  winch = sig;
}

Wouter