处理库中的Posix信号

时间:2016-02-18 15:07:18

标签: c++ linux signals posix

有可能以某种方式处理Posix信号两次吗?当进程终止于我正在编写的库中时,我需要执行一些操作。我这样做就是这样:

signal(SIGSEGV, sig_handler);
signal(SIGABRT, sig_handler);
signal(SIGFPE, sig_handler);
signal(SIGINT, sig_handler);

这有效但不完全可以接受,因为我的图书馆的用户可能因其他原因想要自己处理信号。我想因此我会干涉它。

是否有可能以某种方式处理我的sig_handler中的信号,然后重新抛出"重新抛出"它是否可以透明地供其他需要它的人使用?通过"透明"我的意思是我不想要求用户提供一些"自定义回调",因为我的库已经定义了一个接口,没有真正的标题。在任何情况下,我都需要一些回调,该过程终止,为用户透明安装并为用户透明地处理。有这样的事吗?这个解决方案适用于Linux就足够了。谢谢!

1 个答案:

答案 0 :(得分:0)

最好的选择可能是使用sigaction来获取当前的回调并将你的回调放在中间。 This SO answer解释了这一点。但是,如果应用程序在您完成后设置它,则根本不会看到任何调用。

获得当前的一个:

if (filter_var($email, FILTER_VALIDATE_EMAIL) && preg_match('/@.+\./', $email)) {
    $result = mysql_query ("INSERT INTO users(unique_id, name, email, encrypted_password, salt, created_at) VALUES('$uuid', '$name', '$email', '$encrypted_password', '$salt', NOW())");
    if ($result) { // check for successful store
        // get user details
        $uid = mysql_insert_id(); // last inserted id
        $result = mysql_query("SELECT * FROM users WHERE uid = $uid");
        // return user details
        return mysql_fetch_array($result);
    } else {
        return false; //unsuccessful store
    }
} else {
   //not a valid email
   return false;
}

设置你的:

struct sigaction sa;
sigaction(SIGINT, NULL, &sa);
...

在你的回叫中你打电话给第一个。