代码之家  ›  专栏  ›  技术社区  ›  Wezzer

Windows上Ubuntu上的Bash:信号处理程序不工作

  •  1
  • Wezzer  · 技术社区  · 6 年前

    我尝试运行一个简单的程序(下面的代码),它应该接收并处理 SIGUSR1 信号它在“真正的”Linux上运行得很好,但如果我在发送后在WSL上运行它 SIGUSR1 它打印

    用户定义信号1

    并终止。

    AFAIK这意味着程序没有处理SIGUSR1,调用了默认处理程序。如何使WSL上的信号处理正常工作?

    提前感谢!

    源代码:

    #include <signal.h>
    #include <stdio.h>
    #include <unistd.h>
    
    void handle_signal(int signo)
    {
        write(1, "Recieved user signal\n", 22);
    }
    
    int main()
    {
        struct sigaction act;
    
        act.sa_handler = handle_signal;
        sigfillset(&(act.sa_mask));
    
        sigaction(SIGUSR1, &act, NULL);
    
        printf("PID: %d\n", getpid());
    
        while (1)
            pause();
    
        return 0;
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Eryk Sun    6 年前

    以下建议代码:

    1. 正确检查错误
    2. 正确设置struct sigaction
    3. 干净地编译

    现在,提议的代码:

    #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 signal\n", 21);
        }
        else
        {
            write( 1, "unexpected signal received\n", 27 );
        }
    }
    
    
    int main( void )
    {
        struct sigaction act;
    
        memset( &act, '\0', 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: %d\n", getpid());
    
        while (1)
            pause();
    
        return 0;
    }