Skip to content
Advertisement

Bash on Ubuntu on Windows: Signal handler does not work

I try to run a simple program (code below), that should receive and handle the SIGUSR1 signal. It works well on “real” Linux, but if I run it on WSL after sending SIGUSR1 it prints

User defined signal 1

and terminates.

AFAIK this means that SIGUSR1 wasn’t handled by program and default handler was called. How can I make signal handling on WSL work properly?

Thanks in advance!

Source code:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

void handle_signal(int signo)
{
    write(1, "Recieved user signaln", 22);
}

int main()
{
    struct sigaction act;

    act.sa_handler = handle_signal;
    sigfillset(&(act.sa_mask));

    sigaction(SIGUSR1, &act, NULL);

    printf("PID: %dn", getpid());

    while (1)
        pause();

    return 0;
}

Advertisement

Answer

The following proposed code:

  1. properly checks for errors
  2. properly sets up the struct sigaction
  3. cleanly compiles

And now, the proposed code:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>


void handle_signal(int signo);


void handle_signal(int signo)
{
    if( signo == SIGUSR1 )
    {
        write( 1, "Received user signaln", 21);
    }
    else
    {
        write( 1, "unexpected signal receivedn", 27 );
    }
}


int main( void )
{
    struct sigaction act;

    memset( &act, '', sizeof( act ) );
    act.sa_handler = handle_signal;
    //sigfillset(&(act.sa_mask));  // enable catching all signals

    if( sigaction(SIGUSR1, &act, NULL) != 0)
    {
        perror( "sigaction failed" );
        exit( EXIT_FAILURE );
    }

    printf("PID: %dn", getpid());

    while (1)
        pause();

    return 0;
}
User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement