我必须向进程发送两个信号,SIGUSR1并且SIGUSR2为了修改程序中的特定布尔变量(SIGUSR1将其设置为true,SIGUSR2将其设置为false).所以我写了一个signalHandler()函数来控制SIGUSR1或的行为SIGUSR2.问题是:如何设置sigaction()处理这个特定的任务? 我花了很多时间在谷歌上,我到处读到我应该使用sigaction()而不是过时的signal().在手册页中我找到了这个
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
Run Code Online (Sandbox Code Playgroud)
在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);
};
Run Code Online (Sandbox Code Playgroud)
在第一个字段中我认为我应该设置我的信号处理程序的名称,但我不知道如何设置其他字段.
最后,有什么用struct sigaction *oldact?:
请参见sigaction(2)手册页.这一切都在那里描述.
基本上你设置sa_handler或者sa_sigaction取决于你是否想要额外的信号信息.
如果设置后者,则需要添加SA_SIGINFO到标志中.否则,对于您的情况,标志应该可能为0.您可能希望系统调用EINTR在信号中断时使用errno失败(默认行为),因此您可以在重新启动之前考虑变量的新值,但如果您最终想要自动重启它们(select并且poll从不重新启动),你可以设置SA_RESTART标志.
该sa_mask设置的应同时这葛处理器运行来延迟执行信号.你应该至少设置两个信号,所以如果它们快速连续,它们就不会混淆.
最后,sa_restorer无论如何都是过时的和未使用的.
| 归档时间: |
|
| 查看次数: |
5937 次 |
| 最近记录: |