Skip to content

Sending a signal causes any previously pending signals to disappear #1232

Open
@adamdebek

Description

@adamdebek

Reproduction (ia32-generic-qemu):

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

volatile int sig_recvd;

void handler(int sig) {
    sig_recvd = sig;
}


int main(void) {
    sigset_t set;
    struct sigaction sa;

    sigemptyset(&set);
    sigaddset(&set, SIGHUP);
    sigaddset(&set, SIGPIPE);

    if (sigprocmask(SIG_SETMASK, &set, NULL) < 0) {
        perror("sigprocmask");
        exit(EXIT_FAILURE);
    }

    sa.sa_handler = handler;
    sa.sa_flags = 0;
    sigemptyset(&sa.sa_mask);

    if (sigaction(SIGHUP, &sa, NULL) < 0 || sigaction(SIGPIPE, &sa, NULL) < 0) {
        perror("sigaction");
        exit(EXIT_FAILURE);
    }

    if (kill(getpid(), SIGHUP) < 0 || kill(getpid(), SIGPIPE) < 0) {
        perror("kill");
        exit(EXIT_FAILURE);
    }

#if 1
    if (kill(getpid(), SIGCHLD) < 0) {
        perror("kill wtih sigchild");
        exit(EXIT_FAILURE);
    }
#endif

    if (sig_recvd == SIGHUP && sig_recvd == SIGPIPE) {
        printf("Error: Received on block\n");
        exit(EXIT_FAILURE);
    }

    sig_recvd = 0;

    sigemptyset(&set);
    sigaddset(&set, SIGHUP);
    sigaddset(&set, SIGPIPE);

    if (sigprocmask(SIG_UNBLOCK, &set, NULL) < 0) {
        perror("sigprocmask");
        exit(EXIT_FAILURE);
    }

    if (sig_recvd != SIGHUP && sig_recvd != SIGPIPE) {
        printf("Error: No signal after unblock\n");
        exit(EXIT_FAILURE);
    }
    else {
        printf("success\n");
        exit(EXIT_SUCCESS);
    }

    return 0;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingkernel

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions