c - Is there a way to make my program work with less code? -
i wrote following code school assignment - compiles , prints correct messages. own curiosity, know if code can shorten , still works. tried "signal" instead of "sigaction", heard "sigaction" preferred on "signal". also, assignment requires 3 handlers. can take , give me tips? thank you!
#define _posix_source #define _bsd_source #include <stdio.h> #include <signal.h> #include <string.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> static void sighandler_sigusr1(int sig) { printf("caught sigusr1\n"); //sig contains signal number received } static void sighandler_sigusr2(int sig) { printf("caught sigusr2\n"); } static void sighandler_sigint(int sig) { printf("caught sigint, existing\n"); exit(exit_success); } int main(int argc, char *argv[]) { struct sigaction s1; struct sigaction s2; struct sigaction s3; struct sigaction t; s1.sa_handler = sighandler_sigusr1; sigemptyset(&s1.sa_mask); s1.sa_flags = 0; s2.sa_handler = sighandler_sigusr2; sigemptyset(&s2.sa_mask); s2.sa_flags = 0; s3.sa_handler = sighandler_sigint; sigemptyset(&s3.sa_mask); s3.sa_flags = 0; sigaction(sigusr1, &s1, &t); sigaction(sigusr2, &s2, &t); sigaction(sigint, &s3, &t); kill(getpid(), sigusr1); kill(getpid(), sigusr2); kill(getpid(), sigint); return 0; }
i single signal handler , print function switch-case each kind of signal message:
volatile sig_atomic_t flag = 0; // single signal handler static void sighandler_sigusr(int sig_no){ flag = sig_no; } void print_msg(int message_no){ switch(message_no){ case sigusr1: printf("caught sigusr1\n"); break; case sigusr2: printf("caught sigusr2\n"); break; case sigint: printf("caught sigint, exiting\n"); exit(exit_success); default: printf("some other signal"); } }
now, check flag
in main, , call print_msg(flag)
.
suggestion: avoid using printf in signal handler.
in main(), register single signal handler each kind of signal.
// prepare struct struct sigaction sa; sa.sa_handler = sighandler_sigusr; sa.sa_flags = sa_restart; // restart functions if // interrupted handler /* // uncomment if wants block // signals while 1 executing. sigset_t set; sigemptyset( &set ); sigaddset( &set, sigusr1 ); sigaddset( &set, sigusr2 ); sigaddset( &set, sigint ); sa.sa_mask = set; */ // register signals sigaction( sigusr1, &act, null ); sigaction( sigusr2, &act, null ); sigaction( sigint, &act, null );
see sigaction documentation, including example.
Comments
Post a Comment