首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sigaction :使用“*sa_sigaction( siginfo_t )(int,sigaction *,void *);”

sigaction :使用“*sa_sigaction( siginfo_t )(int,sigaction *,void *);”
EN

Stack Overflow用户
提问于 2017-07-03 15:13:31
回答 3查看 1.5K关注 0票数 1

sigaction手册页中是这样写的:

sa_sigaction还指定要与signum关联的操作。该函数将信号号作为第一个参数,将指向siginfo_t的指针作为第二个参数,将指向ucon- text_t (强制转换为void*)的指针作为第三个参数。

因此,我们可以(通过void*)将参数传递给信号处理程序,但我找不到方法。有没有办法把它放在任何地方?

示例:

代码语言:javascript
复制
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 *中的强制转换)?

EN

回答 3

Stack Overflow用户

发布于 2017-07-03 16:24:19

您不能将任何参数传递给信号处理程序,因为您自己从不调用它。信号处理程序是由OS调用的,它对参数一无所知。

让信号处理程序与主程序通信的标准方法是通过全局(或文件作用域)变量。

票数 0
EN

Stack Overflow用户

发布于 2017-07-03 23:37:43

信号处理程序接收的siginfo_t结构包含一个union sigval si_value成员:

代码语言:javascript
复制
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 (与killraise、faults等相对)要发送信号,需要给它一个union sigval作为参数。

票数 0
EN

Stack Overflow用户

发布于 2017-07-04 02:58:54

您可以这样写:

所以我们可以通过

* ucontext_t参数将参数传递给信号处理程序,但是我找不到方法。

没有这样的方法可以找到- ucontext_t参数是由系统自己设置的,它引用

(具体地说,by spec它至少包含对该中断上下文的引用、对该上下文的特定于机器的表示的引用,以及对当前上下文的堆栈及其阻塞信号集的引用。)

你可能不需要这些。如果您希望您的程序在接收到信号时采取某些操作和/或修改其状态,那么可以在信号处理程序(volatile sigatomic_t flags, self-pipes, platform-specific interfaces)中安全使用的策略是有限的,但是您的主循环当然可以在知道SIGFOO刚刚被接收的情况下做您想做的任何事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44879718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档