]> git.ipfire.org Git - thirdparty/man-pages.git/commitdiff
signal.7: Clarify that siginfo_t isn't changed on coalescing
authorMichal Sekletar <msekleta@redhat.com>
Thu, 11 Jul 2019 12:53:24 +0000 (14:53 +0200)
committerMichael Kerrisk <mtk.manpages@gmail.com>
Sat, 13 Jul 2019 17:44:12 +0000 (11:44 -0600)
Confirmed by experiment by mtk:

$ cat siginfo_nonqueuing.c

                        } while (0)

static void
grimReaper(int sig, siginfo_t *si, void *ucontext)
{
    printf("caught signal %d\n", sig);

    printf("    si_pid=%ld, si_uid=%ld, si_status=%d\n",
            (long) si->si_pid, (long) si->si_uid, si->si_status);
}

static void
child(int sleepTime, uid_t uid, int status)
{
    switch (fork()) {
    case -1:
        errExit("fork");
    case 0:
        sleep(sleepTime);
        if (geteuid() == 0)
            setuid(uid);

        printf("Child %ld with UID %ld exiting with status %d\n",
                (long) getpid(),(long) getuid(), status);
        exit(status);
    default:
        return;
    }
}

int
main(int argc, char *argv[])
{
    struct sigaction sa;
    sigset_t blocking;

    sa.sa_sigaction = grimReaper;
    sa.sa_flags = SA_SIGINFO;
    sigemptyset(&sa.sa_mask);

    if (sigaction(SIGCHLD, &sa, NULL) == -1)
        errExit("sigaction");

    sigemptyset(&blocking);
    sigaddset(&blocking, SIGCHLD);
    if (sigprocmask(SIG_BLOCK, &blocking, NULL) == -1)
        errExit("sigprocmask");

    child(2, 20000, 20);
    child(3, 30000, 30);
    child(1, 10000, 10);

    sleep(5);

    if (sigprocmask(SIG_UNBLOCK, &blocking, NULL) == -1)
        errExit("sigprocmask");

    exit(EXIT_SUCCESS);
}
$ ./siginfo_nonqueuing
Child 4042 with UID 1000 exiting with status 10
Child 4040 with UID 1000 exiting with status 20
Child 4041 with UID 1000 exiting with status 30
caught signal 17
    si_pid=4042, si_uid=1000, si_status=10

Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Lennart Poettering <lennart@poettering.net>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Michal Sekletar <msekleta@redhat.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
man7/signal.7

index 3074f573e70f5e40b1de921f3fd4aa250d929f00..0250e83d33e5807bb1ecc9099fc2b1a968143304 100644 (file)
@@ -436,6 +436,11 @@ Real-time signals are distinguished by the following:
 Multiple instances of real-time signals can be queued.
 By contrast, if multiple instances of a standard signal are delivered
 while that signal is currently blocked, then only one instance is queued.
+Note that the
+.I siginfo_t
+structure associated with the signal already in queue is not overwritten
+on arrival of subsequent instances of the same signal hence the process would
+receive metadata associated with the first instance of the signal.
 .IP 2. 4
 If the signal is sent using
 .BR sigqueue (3),