You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.6 KiB
77 lines
1.6 KiB
/* |
|
Author: Kasper Laudrup <laudrup@stacktrace.dk> |
|
This code is in the public domain. |
|
From patch from bko 214908 |
|
*/ |
|
#include <signal.h> |
|
#include <stdio.h> |
|
#include <string.h> |
|
|
|
int signals[] = {SIGSTOP, SIGCONT, SIGHUP, SIGINT, SIGTERM, SIGKILL, SIGUSR1, SIGUSR2}; |
|
|
|
print_signal_name(int signal) |
|
{ |
|
char *signame; |
|
switch (signal) { |
|
case SIGSTOP: |
|
signame = "SIGSTOP"; |
|
break; |
|
case SIGCONT: |
|
signame = "SIGCONT"; |
|
break; |
|
case SIGHUP: |
|
signame = "SIGHUP"; |
|
break; |
|
case SIGINT: |
|
signame = "SIGINT"; |
|
break; |
|
case SIGTERM: |
|
signame = "SIGTERM"; |
|
break; |
|
case SIGKILL: |
|
signame = "SIGKILL"; |
|
break; |
|
case SIGUSR1: |
|
signame = "SIGUSR1"; |
|
break; |
|
case SIGUSR2: |
|
signame = "SIGUSR1"; |
|
break; |
|
default: |
|
signame = "UNKNOWN"; |
|
break; |
|
} |
|
printf("Caught signal: %s\n", signame); |
|
} |
|
|
|
void handler(int signal) |
|
{ |
|
} |
|
|
|
int main(int argc, char *argv[]) |
|
{ |
|
sigset_t waitset; |
|
struct sigaction sigact; |
|
int signal, result, i; |
|
int signals_size = sizeof(signals) / sizeof(int); |
|
|
|
sigemptyset(&sigact.sa_mask); |
|
sigemptyset(&waitset); |
|
sigact.sa_flags = 0; |
|
sigact.sa_handler = handler; |
|
for (i = 0; i < signals_size; i++) { |
|
sigaction(signals[i], &sigact, NULL); |
|
sigaddset(&waitset, signals[i]); |
|
} |
|
|
|
printf("Waiting for signal\n"); |
|
result = sigwait(&waitset, &signal); |
|
if (result == 0) { |
|
print_signal_name(signal); |
|
return 0; |
|
} else { |
|
char *error = strerror(result); |
|
printf("Error calling sigwait: %s\n", error); |
|
return 1; |
|
} |
|
}
|
|
|