问题描述
我为学校作业编写了以下代码 - 它编译并打印所有正确的消息.但只是出于我自己的好奇心,我想知道我的代码是否可以缩短并且仍然有效.我尝试使用signal"而不是sigaction",但我听说sigaction"比signal"更受欢迎.此外,此分配需要 3 个处理程序.有人可以看看并给我一些提示吗?谢谢!
I wrote the following code for a school assignment - It compiles and prints all the correct messages. But just for my own curiosity, I would like to know if my code can be shorten and still works. I tried "signal" instead of "sigaction", but I heard that "sigaction" is strongly preferred over "signal". Also, this assignment requires 3 handlers. Can someone take a look and give me some 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
"); //sig contains the signal number that was received
}
static void sigHandler_sigusr2(int sig)
{
printf("Caught SIGUSR2
");
}
static void sigHandler_sigint(int sig)
{
printf("Caught SIGINT, Existing
");
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 的打印函数,用于每种信号消息:
I would like single signal handler and a print function with switch-case for 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
");
break;
case SIGUSR2: printf("Caught SIGUSR2
");
break;
case SIGINT: printf("Caught SIGINT, Exiting
");
exit(EXIT_SUCCESS);
default:
printf("Some other signal");
}
}
现在,检查 main 中的 flag
,然后调用 print_msg(flag)
.
我的建议:避免在信号处理程序中使用 printf.
Now, Check the flag
in your main, and call print_msg(flag)
.
My suggestion: avoid using printf in a signal handler.
在 main() 中,为每种信号注册单个信号处理程序.
In main(), register your single signal handler for each kind of signal.
// 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 文档,包括一个例子.
See the sigaction documentation, including an example.
这篇关于有没有办法让我的程序用更少的代码工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!