-
Notifications
You must be signed in to change notification settings - Fork 2
/
t_sigwaitinfo.c
63 lines (52 loc) · 2.23 KB
/
t_sigwaitinfo.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/**********************************************************************\
* Copyright (C) Michael Kerrisk, 2010. *
* *
* This program is free software. You may use, modify, and redistribute *
* it under the terms of the GNU Affero General Public License as *
* published by the Free Software Foundation, either version 3 or (at *
* your option) any later version. This program is distributed without *
* any warranty. See the file COPYING for details. *
\**********************************************************************/
/* t_sigwaitinfo.c
Demonstrate the use of sigwaitinfo() to synchronously wait for a signal.
*/
#define _GNU_SOURCE
#include <string.h>
#include <signal.h>
#include <time.h>
#include "tlpi_hdr.h"
int
main(int argc, char *argv[])
{
int sig;
siginfo_t si;
sigset_t allSigs;
if (argc > 1 && strcmp(argv[1], "--help") == 0)
usageErr("%s [delay-secs]\n", argv[0]);
printf("%s: PID is %ld\n", argv[0], (long) getpid());
/* Block all signals (except SIGKILL and SIGSTOP) */
sigfillset(&allSigs);
if (sigprocmask(SIG_SETMASK, &allSigs, NULL) == -1)
errExit("sigprocmask");
printf("%s: signals blocked\n", argv[0]);
if (argc > 1) { /* Delay so that signals can be sent to us */
printf("%s: about to delay %s seconds\n", argv[0], argv[1]);
sleep(getInt(argv[1], GN_GT_0, "delay-secs"));
printf("%s: finished delay\n", argv[0]);
}
for (;;) { /* Fetch signals until SIGINT (^C) or SIGTERM */
sig = sigwaitinfo(&allSigs, &si);
if (sig == -1)
errExit("sigwaitinfo");
if (sig == SIGINT || sig == SIGTERM)
exit(EXIT_SUCCESS);
printf("got signal: %d (%s)\n", sig, strsignal(sig));
printf(" si_signo=%d, si_code=%d (%s), si_value=%d\n",
si.si_signo, si.si_code,
(si.si_code == SI_USER) ? "SI_USER" :
(si.si_code == SI_QUEUE) ? "SI_QUEUE" : "other",
si.si_value.sival_int);
printf(" si_pid=%ld, si_uid=%ld\n",
(long) si.si_pid, (long) si.si_uid);
}
}