#include <inttypes.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define ADD_SIGNAL(signal) { signal, #signal }
const struct {
int signal;
const char* name;
} kSignals[] = {
ADD_SIGNAL(SIGHUP),
ADD_SIGNAL(SIGINT),
ADD_SIGNAL(SIGQUIT),
ADD_SIGNAL(SIGILL),
ADD_SIGNAL(SIGCHLD),
ADD_SIGNAL(SIGABRT),
ADD_SIGNAL(SIGPIPE),
ADD_SIGNAL(SIGFPE),
ADD_SIGNAL(SIGKILL),
ADD_SIGNAL(SIGSTOP),
ADD_SIGNAL(SIGSEGV),
ADD_SIGNAL(SIGCONT),
ADD_SIGNAL(SIGTSTP),
ADD_SIGNAL(SIGALRM),
ADD_SIGNAL(SIGTERM),
ADD_SIGNAL(SIGTTIN),
ADD_SIGNAL(SIGTTOU),
ADD_SIGNAL(SIGUSR1),
ADD_SIGNAL(SIGUSR2),
ADD_SIGNAL(SIGWINCH),
ADD_SIGNAL(SIGKILLTHR),
ADD_SIGNAL(SIGTRAP),
{-1, NULL}
};
#define ADD_SA_FLAG(flag) { flag, #flag }
const struct {
int flag;
const char* name;
} kSigActionFlags[] = {
ADD_SA_FLAG(SA_NOCLDSTOP),
#ifdef SA_NOCLDWAIT
ADD_SA_FLAG(SA_NOCLDWAIT),
#endif
#ifdef SA_RESETHAND
ADD_SA_FLAG(SA_RESETHAND),
#endif
#ifdef SA_NODEFER
ADD_SA_FLAG(SA_NODEFER),
#endif
#ifdef SA_RESTART
ADD_SA_FLAG(SA_RESTART),
#endif
#ifdef SA_ONSTACK
ADD_SA_FLAG(SA_ONSTACK),
#endif
#ifdef SA_SIGINFO
ADD_SA_FLAG(SA_SIGINFO),
#endif
{0, NULL}
};
int
main(int argc, const char* const* argv)
{
printf("process id: %d\n", (int)getpid());
printf("parent id: %d\n", (int)getppid());
printf("process group: %d\n", (int)getpgrp());
printf("fg process group: %d\n", (int)tcgetpgrp(STDOUT_FILENO));
sigset_t signalMask;
sigprocmask(SIG_BLOCK, NULL, &signalMask);
printf("blocked signals: ");
bool printedFirst = false;
for (int i = 0; kSignals[i].name; i++) {
if (sigismember(&signalMask, kSignals[i].signal)) {
if (printedFirst) {
printf(", ");
} else
printedFirst = true;
printf("%s", kSignals[i].name);
}
}
printf("\n");
printf("signal handlers:\n");
for (int i = 0; kSignals[i].name; i++) {
struct sigaction action;
sigaction(kSignals[i].signal, NULL, &action);
int signalNameSpacing = 10 - (int)strlen(kSignals[i].name);
if (signalNameSpacing < 0)
signalNameSpacing = 0;
printf(" %s:%*s ", kSignals[i].name, signalNameSpacing, "");
if (action.sa_handler == SIG_DFL)
printf("SIG_DFL");
else if (action.sa_handler == SIG_IGN)
printf("SIG_IGN");
else if (action.sa_handler == SIG_ERR)
printf("SIG_ERR");
else
printf("%p", action.sa_handler);
printf(" (");
printedFirst = false;
for (int i = 0; kSigActionFlags[i].name; i++) {
if (action.sa_flags & kSigActionFlags[i].flag) {
if (printedFirst) {
printf(", ");
} else
printedFirst = true;
printf("%s", kSigActionFlags[i].name);
}
}
printf(")\n");
}
return 0;
}