Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有可能将信号处理(c库)映射到c++;例外 我有一个C++应用程序,与一些C库链接。 是否有可能封装C++类中的信号处理,因此可以作为C++异常处理?< /P> < P>信号处理是非常严格的OS级,一般不使用。 用于“错误”处理,除非它们是SIGSEGV或SIGFPU,这通常会导致程序发生非常糟糕的事情,但用于对系统中发生的特定事件发出警报_C++_C - Fatal编程技术网

是否有可能将信号处理(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:我通过通知()从