有没有办法让我的程序使用更少的代码?

我为学校作业编写了以下代码 – 它编译并打印所有正确的消息。 但仅仅是出于我自己的好奇心,我想知道我的代码是否可以缩短并且仍然有效。 我试过“信号”而不是“sigaction”,但我听说“sigaction”比“信号”更受欢迎。 此外,此分配需要3个处理程序。 有人可以看看并给我一些提示吗? 谢谢!

#define _POSIX_SOURCE #define _BSD_SOURCE #include  #include  #include  #include  #include  #include  #include  static void sigHandler_sigusr1(int sig) { printf("Caught SIGUSR1\n"); //sig contains the signal number that was 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; } 

我希望单信号处理程序和带有switch-case的打印function用于各种信号消息:

 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"); } } 

现在,检查main中的flag ,并调用print_msg(flag)
我的建议: 避免在信号处理程序中使用printf 。

在main()中,为每种信号注册单个信号处理程序。

 // prepare struct struct sigaction sa; sa.sa_handler = sigHandler_sigusr; sa.sa_flags = SA_RESTART; // Restart functions if // interrupted by handler /* // unComment if you wants to block // some signals while one is 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 ); 

请参阅sigaction文档 ,包括示例。

 static void sigHandlers(int sig) { if (sig == SIGINT) printf("Caught SIGINT, Existing\n"); else if (sig == SIGUSR1) printf("Caught SIGUSR1\n"); else //no need to switch since you have only 3 sig printf("Caught SIGUSR2\n"); exit(EXIT_SUCCESS); } int main(int argc, char *argv[]) { struct sigaction s[4] = {0}; s[0].sa_handler = sigHandlers; sigemptyset(&(s[0].sa_mask)); memcpy(&s[1], s, sizeof(struct sigaction)); memcpy(&s[2], s, sizeof(struct sigaction)); sigaction(SIGUSR1, &s[0], &s[3]); sigaction(SIGUSR2, &s[1], &s[3]); sigaction(SIGINT, &s[2], &s[3]); kill(getpid(), SIGUSR1); kill(getpid(), SIGUSR2); kill(getpid(), SIGINT); return 0; } 

但我相信你可以用#define减少代码