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

Popular posts from this blog

How to mention the localhost in android -

php - Calling a template part from a post -

c# - String.format() DateTime With Arabic culture -