/* Signals. */ /* * 1. HUP -- return pid * 2. INT -- return uid * 3. TERM -- return gid * 4. USR1 -- return time * 5. USR2 -- return loadavg[3] */ #include #include #include #include #include #include #include #include #include "common.h" #define create_sighandler_( _sig, _act, _func, _set ) \ memset( &_act, 0, sizeof(struct sigaction)); \ _act.sa_handler = _func; \ _act.sa_mask = _set; \ sigaction( _sig, &_act, 0); static struct inf_t data; void print_gid( void ) { printf("GID: %d\n", data.id.gid); } void print_uid( void ) { printf("UID: %d\n", data.id.uid); } void print_pid( void ) { printf("PID: %d\n", data.id.pid); } void print_time( void ) { printf("TIME: %.1f\n", (float)data.time); } void print_load( void ) { printf("LOAD 5 MIN: %.3f\nLOAD 10 MIN: %.3f\nLOAD 15 MIN: %.3f\n", data.loadavg[0], data.loadavg[1], data.loadavg[2]); } int main( int argc, char* argv[] ) { struct sigaction act_hup, act_int, act_term, act_usr1, act_usr2; sigset_t mask; time_t start; start = time(NULL); set_id(&data); update_inf(&data, start); if( signal( SIGHUP, SIG_DFL ) == SIG_IGN ) fputs("HUP ignore.\n", stderr); /* Set mask for blocking signals. */ sigemptyset( &mask ); sigaddset( &mask, SIGHUP ); sigaddset( &mask, SIGINT ); sigaddset( &mask, SIGTERM ); sigaddset( &mask, SIGUSR1 ); sigaddset( &mask, SIGUSR2 ); create_sighandler_( SIGHUP , act_hup , print_pid , mask); create_sighandler_( SIGINT , act_int , print_uid , mask); create_sighandler_( SIGTERM, act_term, print_gid , mask); create_sighandler_( SIGUSR1, act_usr1, print_time , mask); create_sighandler_( SIGUSR2, act_usr2, print_load , mask); while( 1 ) { /* Update info per sec. */ update_inf(&data, start); sleep( 1 ); } return 0; }