是否有可能将信号处理(c库)映射到c++;例外 我有一个C++应用程序,与一些C库链接。 是否有可能封装C++类中的信号处理,因此可以作为C++异常处理?< /P> < P>信号处理是非常严格的OS级,一般不使用。 用于“错误”处理,除非它们是SIGSEGV或SIGFPU,这通常会导致程序发生非常糟糕的事情,但用于对系统中发生的特定事件发出警报
此外,在信号处理器中,您可以执行非常有限的任务,实际上只有少数系统调用是信号安全的是否有可能将信号处理(c库)映射到c++;例外 我有一个C++应用程序,与一些C库链接。 是否有可能封装C++类中的信号处理,因此可以作为C++异常处理?< /P> < P>信号处理是非常严格的OS级,一般不使用。 用于“错误”处理,除非它们是SIGSEGV或SIGFPU,这通常会导致程序发生非常糟糕的事情,但用于对系统中发生的特定事件发出警报,c++,c,C++,C,此外,在信号处理器中,您可以执行非常有限的任务,实际上只有少数系统调用是信号安全的 所以,一般不要因为信号而抛出(;-)信号处理在操作系统级别上非常严格,通常不使用 用于“错误”处理,除非它们是SIGSEGV或SIGFPU,这通常会导致程序发生非常糟糕的事情,但用于对系统中发生的特定事件发出警报 此外,在信号处理器中,您可以执行非常有限的任务,实际上只有少数系统调用是信号安全的 所以,一般不要因为信号而抛出(;-)你不能,如果可以,很多东西都会坏掉 您应该做的是在信号处理程序中设置一个标志,定期
所以,一般不要因为信号而抛出(
;-)代码>信号处理在操作系统级别上非常严格,通常不使用
用于“错误”处理,除非它们是SIGSEGV或SIGFPU,这通常会导致程序发生非常糟糕的事情,但用于对系统中发生的特定事件发出警报
此外,在信号处理器中,您可以执行非常有限的任务,实际上只有少数系统调用是信号安全的
所以,一般不要因为信号而抛出(;-)代码>你不能,如果可以,很多东西都会坏掉
您应该做的是在信号处理程序中设置一个标志,定期检入代码,并在检测到标志被设置时引发异常
这种方法类似于线程被打断的方式,我强烈建议您研究它。您不能,如果可以,很多事情都会中断
您应该做的是在信号处理程序中设置一个标志,定期检入代码,并在检测到标志被设置时引发异常
这种方法类似于线程被中断的方式,我强烈建议您进行研究。如果您的意思是,如果您希望在信号传递到进程时在任意代码点抛出异常,则您不能。信号是在不同的执行上下文中传递的,因此您的原始线程将无法捕获它
即使可以,也不应该这样做,因为关于操作原子性和异常安全保证的任何假设都会被忽略。如果您的意思是,如果您希望在信号传递到进程时在任意代码点抛出异常,则您不能。信号是在不同的执行上下文中传递的,因此您的原始线程将无法捕获它
即使可以,也不应该这样做,因为关于操作原子性和异常安全保证的任何假设都会被忽略。正如多次指出的那样,这样做通常不是一个好主意。如果你真的想这么做,这里有一些我不久前写的东西
#include <signal.h>
#include <exception>
#include <iostream>
//template class that translates a signal in an exception
//the given SignalExceptionClass should have a static int signalNumber()
template<class SignalExceptionClass>
class SignalTranslator
{
private:
class SingletonTranslator
{
public:
SingletonTranslator()
{
signal(SignalExceptionClass::signalNumber(), handler);
}
static void handler(int)
{
throw SignalExceptionClass();
}
};
public:
//sigleton pattern so we don't install more than one handler
//for a given signal
SignalTranslator()
{
static SingletonTranslator translator;
}
};
//example for SIGFPE
class FloatingPointException : public std::exception
{
public:
static int signalNumber() {return SIGFPE;}
const char* what() const throw() {return "Floating point exception";}
};
//install translators
static SignalTranslator<FloatingPointException> fpeTranslator;
int main()
{
try
{
std::cout << "causing SIGFPE\n";
std::cout << 1 / 0 << std::endl;
}
catch (std::exception& e)
{
std::cout << e.what() << std::endl;
}
std::cout << "after SIGFPE\n";
}
注意:这不适用于所有类型的信号。例如,它不适用于SIGSEGV。正如多次指出的那样,这样做通常不是一个好主意。如果你真的想这么做,这里有一些我不久前写的东西
#include <signal.h>
#include <exception>
#include <iostream>
//template class that translates a signal in an exception
//the given SignalExceptionClass should have a static int signalNumber()
template<class SignalExceptionClass>
class SignalTranslator
{
private:
class SingletonTranslator
{
public:
SingletonTranslator()
{
signal(SignalExceptionClass::signalNumber(), handler);
}
static void handler(int)
{
throw SignalExceptionClass();
}
};
public:
//sigleton pattern so we don't install more than one handler
//for a given signal
SignalTranslator()
{
static SingletonTranslator translator;
}
};
//example for SIGFPE
class FloatingPointException : public std::exception
{
public:
static int signalNumber() {return SIGFPE;}
const char* what() const throw() {return "Floating point exception";}
};
//install translators
static SignalTranslator<FloatingPointException> fpeTranslator;
int main()
{
try
{
std::cout << "causing SIGFPE\n";
std::cout << 1 / 0 << std::endl;
}
catch (std::exception& e)
{
std::cout << e.what() << std::endl;
}
std::cout << "after SIGFPE\n";
}
注意:这不适用于所有类型的信号。例如,它对SIGSEGV不起作用。听起来好像你试图做一些非常错误的事情。通常,除非有特殊原因,否则不要发出信号。对于管理员来说,信号比软件开发人员更重要
否则,将信号映射到异常是相当复杂的(通常是不可能的),因为允许操作系统合并某些信号。例如,如果两个子进程同时终止,SIGCHLD只会发生一次。您不能计划抛出两个异常——一个接一个
另一点是,在多线程应用程序中,允许将信号传递给任何线程。一件事是抛出异常。但是您可能最终会遇到这样的问题:在您想要的位置捕获异常
在终止和收割孩子时,超出标准清理范围-不要玩弄信号。现代*NIX允许在没有信号的情况下完成应用程序所需的几乎所有操作。听起来好像你试图做一些非常错误的事情。通常,除非有特殊原因,否则不要发出信号。对于管理员来说,信号比软件开发人员更重要
否则,将信号映射到异常是相当复杂的(通常是不可能的),因为允许操作系统合并某些信号。例如,如果两个子进程同时终止,SIGCHLD只会发生一次。您不能计划抛出两个异常——一个接一个
另一点是,在多线程应用程序中,允许将信号传递给任何线程。一件事是抛出异常。但是您可能最终会遇到这样的问题:在您想要的位置捕获异常
在终止和收割孩子时,超出标准清理范围-不要玩弄信号。现代*NIX允许在没有信号的情况下完成几乎所有应用程序需要的操作。我可能会为您提供一个解决方案
我正在为C开发一个异常处理框架。它可以将系统信号转换为异常。例如,它允许您通过以下方式捕获SIGSEGV
:
int * pointer = NULL;
try{
int oops = *pointer;
}catch(BadPointerException){
printf("No problem ;-)");
}
这些异常是<>强>不是< /强> C++异常。该库是标准的ANSI C(C89)。
我可能会为您提供一个解决方案
我正在为C开发一个异常处理框架。它可以将系统信号转换为异常。例如,它允许您通过以下方式捕获SIGSEGV
:
int * pointer = NULL;
try{
int oops = *pointer;
}catch(BadPointerException){
printf("No problem ;-)");
}
这些异常是<>强>不是< /强> C++异常。该库是标准ANSI C(C89)。
我的应用程序有一些线程同时运行,我关心的是如何在某种信号下干净地停止应用程序。这听起来是个有趣的建议。我还将检查Boost.Threads。@pcent:我通过通知()从