有可能以某种方式处理Posix信号两次吗?当进程终止于我正在编写的库中时,我需要执行一些操作。我这样做就是这样:
signal(SIGSEGV, sig_handler);
signal(SIGABRT, sig_handler);
signal(SIGFPE, sig_handler);
signal(SIGINT, sig_handler);
这有效但不完全可以接受,因为我的图书馆的用户可能因其他原因想要自己处理信号。我想因此我会干涉它。
是否有可能以某种方式处理我的sig_handler中的信号,然后重新抛出"重新抛出"它是否可以透明地供其他需要它的人使用?通过"透明"我的意思是我不想要求用户提供一些"自定义回调",因为我的库已经定义了一个接口,没有真正的标题。在任何情况下,我都需要一些回调,该过程终止,为用户透明安装并为用户透明地处理。有这样的事吗?这个解决方案适用于Linux就足够了。谢谢!
答案 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);
...
在你的回叫中你打电话给第一个。