1. <i id='lCHjI'><tr id='lCHjI'><dt id='lCHjI'><q id='lCHjI'><span id='lCHjI'><b id='lCHjI'><form id='lCHjI'><ins id='lCHjI'></ins><ul id='lCHjI'></ul><sub id='lCHjI'></sub></form><legend id='lCHjI'></legend><bdo id='lCHjI'><pre id='lCHjI'><center id='lCHjI'></center></pre></bdo></b><th id='lCHjI'></th></span></q></dt></tr></i><div id='lCHjI'><tfoot id='lCHjI'></tfoot><dl id='lCHjI'><fieldset id='lCHjI'></fieldset></dl></div>

        <small id='lCHjI'></small><noframes id='lCHjI'>

      2. <legend id='lCHjI'><style id='lCHjI'><dir id='lCHjI'><q id='lCHjI'></q></dir></style></legend>
        <tfoot id='lCHjI'></tfoot>

          <bdo id='lCHjI'></bdo><ul id='lCHjI'></ul>

        从信号处理程序中引发异常

        Throwing an exception from within a signal handler(从信号处理程序中引发异常)
        • <bdo id='qfBxu'></bdo><ul id='qfBxu'></ul>
          <tfoot id='qfBxu'></tfoot>

            <legend id='qfBxu'><style id='qfBxu'><dir id='qfBxu'><q id='qfBxu'></q></dir></style></legend>
          • <i id='qfBxu'><tr id='qfBxu'><dt id='qfBxu'><q id='qfBxu'><span id='qfBxu'><b id='qfBxu'><form id='qfBxu'><ins id='qfBxu'></ins><ul id='qfBxu'></ul><sub id='qfBxu'></sub></form><legend id='qfBxu'></legend><bdo id='qfBxu'><pre id='qfBxu'><center id='qfBxu'></center></pre></bdo></b><th id='qfBxu'></th></span></q></dt></tr></i><div id='qfBxu'><tfoot id='qfBxu'></tfoot><dl id='qfBxu'><fieldset id='qfBxu'></fieldset></dl></div>
              <tbody id='qfBxu'></tbody>

            <small id='qfBxu'></small><noframes id='qfBxu'>

                • 本文介绍了从信号处理程序中引发异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我们有一个处理错误报告许多方面的库.我的任务是将此库移植到 Linux.通过我的小测试套件运行时,其中一个测试失败了.测试的简化版本如下所示.

                  We have a library that deals with many aspects of error reporting. I have been tasked to port this library to Linux. When running though my little test suite, one of the tests failed. A simplified version of the test appears below.

                  // Compiler: 4.1.1 20070105 RedHat 4.1.1-52
                  // Output: Terminate called after throwing an instance of 'int' abort
                  
                  #include <iostream>
                  #include <csignal>
                  using namespace std;
                  
                  void catch_signal(int signalNumber)
                  {
                      signal(SIGINT, SIG_DFL);
                      throw(signalNumber);
                  }
                  
                  int test_signal()
                  {
                      signal(SIGINT, catch_signal);
                  
                      try
                      {
                          raise(SIGINT);
                      }
                      catch (int &z)
                      {
                          cerr << "Caught exception: " << z << endl;
                      }
                      return 0;
                  }
                  
                  int main()
                  {
                      try
                      {
                          test_signal();
                      }
                      catch (int &z)
                      {
                          cerr << "Caught unexpected exception: " << z << endl;
                      }
                      return 0;
                  }
                  

                  我的期望是显示 Caught exception: 消息.实际发生的是程序终止,因为抛出的 int 似乎没有 catch 处理程序.

                  My expectation is that the Caught exception: message will be displayed. What actually happens is that the program terminates as no catch handler appears to be present for the thrown int.

                  有几个关于 SO 的问题似乎相关.我发现了一些相关的谷歌页面.智慧"似乎可以归结为.

                  There are a few questions on SO that seem related. I found a number of Google pages that were related. The 'wisdom' seems to boil down to.

                  1. 你不能从信号处理程序中抛出异常,导致信号处理程序使用自己的堆栈运行,因此没有定义处理程序.
                  2. 你可以从信号处理程序中抛出异常,只是重建一个假的堆栈上的框架,你很高兴.
                  3. 是的,我们一直都这样做.它适用于 X 平台
                  4. 是的,它曾经可用于 gcc,但似乎不起作用更多的.试试 -fnon-call-exceptions 选项,也许会起作用

                  代码在我们的 AIX/TRU64/MSVC 编译器/环境中按预期工作.它在我们的 Linux 环境中失败.

                  The code works as expected on our AIX/TRU64/MSVC compiler/environments. It fails in our Linux environment.


                  我正在寻找帮助解决此问题的建议,以便 Linux 上的库行为与我的其他平台相匹配,或者可以实现相同功能的某种类型或解决方法.
                  让程序核心转储信号,不是一个可行的选择.

                  推荐答案

                  信号与 C++ 异常完全不同.您不能使用 C++ try/catch 块来处理信号.具体来说,信号是 POSIX 概念,而不是 C++ 语言概念.信号由内核异步传递给您的应用程序,而 C++ 异常是由 C++ 标准定义的同步事件.

                  Signals are totally different than C++ exceptions. You can't use a C++ try/catch block to handle a signal. Specifically, signals are a POSIX concept, not a C++ language concept. Signals are delivered asynchronously to your application by the kernel, whereas C++ exceptions are synchronous events defined by the C++ standard.

                  您可以在 POSIX 信号处理程序中进行可移植的操作非常有限.一个常见的策略是有一个 sig_atomic_t 类型的全局标志,它将在信号处理程序中设置为 1,然后可能将 longjmp 设置为适当的执行路径.

                  You are quite limited in what you can do portably in a POSIX signal handler. A common strategy is to have a global flag of type sig_atomic_t which will be set to 1 in the signal handler, and then possibly longjmp to the appropriate execution path.

                  请参阅此处获取帮助编写适当的信号处理程序.

                  See here for help writing proper signal handlers.

                  这篇关于从信号处理程序中引发异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  Unable to access non-const member functions of objects in C++ std::set(无法访问 C++ std::set 中对象的非常量成员函数)
                  How should a size-limited stl-like container be implemented?(应该如何实现大小受限的 stl 类容器?)
                  Constructing std::function argument from lambda(从 lambda 构造 std::function 参数)
                  STL BigInt class implementation(STL BigInt 类实现)
                  Sync is unreliable using std::atomic and std::condition_variable(使用 std::atomic 和 std::condition_variable 同步不可靠)
                  Move list element to the end in STL(在 STL 中将列表元素移动到末尾)
                    <tbody id='HVFUM'></tbody>
                  <legend id='HVFUM'><style id='HVFUM'><dir id='HVFUM'><q id='HVFUM'></q></dir></style></legend>
                    <i id='HVFUM'><tr id='HVFUM'><dt id='HVFUM'><q id='HVFUM'><span id='HVFUM'><b id='HVFUM'><form id='HVFUM'><ins id='HVFUM'></ins><ul id='HVFUM'></ul><sub id='HVFUM'></sub></form><legend id='HVFUM'></legend><bdo id='HVFUM'><pre id='HVFUM'><center id='HVFUM'></center></pre></bdo></b><th id='HVFUM'></th></span></q></dt></tr></i><div id='HVFUM'><tfoot id='HVFUM'></tfoot><dl id='HVFUM'><fieldset id='HVFUM'></fieldset></dl></div>

                        • <bdo id='HVFUM'></bdo><ul id='HVFUM'></ul>

                            <small id='HVFUM'></small><noframes id='HVFUM'>

                            <tfoot id='HVFUM'></tfoot>