在sigaction手册页中是这样写的:
sa_sigaction还指定要与signum关联的操作。该函数将信号号作为第一个参数,将指向siginfo_t的指针作为第二个参数,将指向ucon- text_t (强制转换为void*)的指针作为第三个参数。
因此,我们可以(通过void*)将参数传递给信号处理程序,但我找不到方法。有没有办法把它放在任何地方?
示例:
struct ping_val
{
int data1;
int data2;
};
void ping(int sig, siginfo_t *siginf, void *ptr)
{
// ....
}
int main()
{
struct sigaction sa_ping;
ping_val foo;
foo.data1 = 3;
foo.data2 = 4;
sa_ping.sa_sigaction = ping;
sigemptyset(&sa_ping.sa_mask);
sa_ping.sa_flags = 0;
sigaction(SIGALRM, &sa_ping, NULL);
// ....
}我可以在ping的参数中传递foo结构值(使用struct *中的强制转换)?
发布于 2017-07-03 16:24:19
您不能将任何参数传递给信号处理程序,因为您自己从不调用它。信号处理程序是由OS调用的,它对参数一无所知。
让信号处理程序与主程序通信的标准方法是通过全局(或文件作用域)变量。
发布于 2017-07-03 23:37:43
信号处理程序接收的siginfo_t结构包含一个union sigval si_value成员:
union sigval {
int sival_int; // Integer signal value
void *sival_ptr; // Pointer signal value
}因此,如果您在单个进程内(或者在某些情况下,我认为是在fork之间)发送信号,则可以发送指向某些数据的指针。
我知道有两种方法可以将sigval值发送到信号处理程序:
如果使用timer_create创建计时器,则向其传递一个sigevent结构,该结构包含一个union sigval sigev_value成员。按照惯例,用户代码会将sigev_value.sival_ptr设置为计时器ID,以便信号处理程序可以在必要时区分多个计时器,但您可以将其设置为任何void *值。
如果您使用sigqueue (与kill、raise、faults等相对)要发送信号,需要给它一个union sigval作为参数。
发布于 2017-07-04 02:58:54
您可以这样写:
所以我们可以通过
* ucontext_t参数将参数传递给信号处理程序,但是我找不到方法。
没有这样的方法可以找到- ucontext_t参数是由系统自己设置的,它引用
(具体地说,by spec它至少包含对该中断上下文的引用、对该上下文的特定于机器的表示的引用,以及对当前上下文的堆栈及其阻塞信号集的引用。)
你可能不需要这些。如果您希望您的程序在接收到信号时采取某些操作和/或修改其状态,那么可以在信号处理程序(volatile sigatomic_t flags, self-pipes, platform-specific interfaces)中安全使用的策略是有限的,但是您的主循环当然可以在知道SIGFOO刚刚被接收的情况下做您想做的任何事情。
https://stackoverflow.com/questions/44879718
复制相似问题