c - sigaction() 的使用

标签 c signals

我必须向进程发送两个信号,SIGUSR1SIGUSR2,以便修改程序中的特定 bool 变量 (SIGUSR1 将其设置为 trueSIGUSR2 将其设置为 false)。所以我写了一个 signalHandler() 函数来控制 SIGUSR1SIGUSR2 的行为。问题是:如何设置 sigaction() 来处理这个特定的任务?我在 Google 上花了很多时间,到处都读到我应该使用 sigaction () 而不是过时的 signal()。在手册页中我找到了这个

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);

在 signum 中我必须输入我想要处理的信号类型,然后我有一个 struct sigaction 参数:

  struct sigaction {
       void     (*sa_handler)(int);
       void     (*sa_sigaction)(int, siginfo_t *, void *);
       sigset_t   sa_mask;
       int        sa_flags;
       void     (*sa_restorer)(void);
   };

在第一个字段中,我认为我应该设置信号处理程序的名称,但我不知道如何设置其他字段。

最后,有什么用:struct sigaction *oldact

最佳答案

参见 sigaction(2)手册页。那里都有描述。

基本上,您可以设置 sa_handlersa_sigaction,具体取决于您是否需要额外的信号信息。

如果设置的是后者,则需要在flags中添加SA_SIGINFO。否则,对于您的情况,标志可能应该为 0。您可能希望系统调用在被信号中断时因 errno EINTR 而失败(默认行为),因此您可以在重新启动它们之前考虑变量的新值,但如果您最终想要重新启动它们自动(selectpoll 永远不会重新启动),您可以设置 SA_RESTART 标志。

sa_mask 是信号处理程序运行时应延迟的一组信号。您至少应该设置两个信号,这样如果它们快速连续出现,它们就不会混淆。

最后一个 sa_restorer 已过时且未被使用。

关于c - sigaction() 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8573842/

相关文章:

c - C中的多个警报?

c - sigemptyset() 正在覆盖下一个变量

c - x86, amd64 : Why SIGTRAP' ucontext instruction pointer does not point to related int3

linux - 进程 sighandler 可以处理 linux 信号 SIG_KILL 吗?

objective-c - C 中的 calloc 结构体

c++ - C API函数的风格

c - 使用双指针将字符串转换为链表

django - post_syncdb 上不存在 ContentType 匹配查询

指针符号的 C 解释?

c - PIC24H 中的高速 UART 中断导致 FreeRTOS 错误