Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++_Exception_Exception Handling_Operating System_Cpu - Fatal编程技术网

C++ 抛出异常是谁的责任?;操作系统还是进程?

C++ 抛出异常是谁的责任?;操作系统还是进程?,c++,exception,exception-handling,operating-system,cpu,C++,Exception,Exception Handling,Operating System,Cpu,从操作系统的角度来看,异常是如何工作的? 从C++中,我可以从程序员的角度理解异常。 当抛出异常时,堆栈开始展开,每个激活记录都有机会捕获和处理异常 但是首先抛出异常是谁的责任呢? 是操作系统向进程发送触发器吗 告诉它进入“异常处理状态” 是 在自己的程序空间中调用和处理异常的过程, 没有通知操作系统 这里有两个崩溃的程序说明了我的不确定性 int main(){ int i = 1/0; //did the OS tell the process to end? retur

从操作系统的角度来看,异常是如何工作的?

从C++中,我可以从程序员的角度理解异常。 当抛出异常时,堆栈开始展开,每个激活记录都有机会捕获和处理异常

但是首先抛出异常是谁的责任呢?

  • 是操作系统向进程发送触发器吗 告诉它进入“异常处理状态”
  • 是 在自己的程序空间中调用和处理异常的过程, 没有通知操作系统
  • 这里有两个崩溃的程序说明了我的不确定性

    int main(){
    
        int i = 1/0; //did the OS tell the process to end?
    
        return 0;
    }
    

    #包括
    int main(){
    抛出11;//进程是否告诉操作系统它需要结束?
    返回0;
    }
    
    您所说的是两个完全不同的异常过程

    第一个是由操作系统提供的。在Windows中,您可以使用来处理它们


    第二个是由C++编译器提供的,不涉及任何操作系统。

    < P>因为我只知道一个或两个OS在C++中写的,而我知道的一个,根本没有正式使用异常,这几乎排除了OS所抛出的异常。p>

    三个主要OS(Linux、Windows、MaCMOS X)以及所有形式的UNIX(AIX、Solaris、HPX等)都是用C编写的,还有几乎所有其他商业上不可用汇编语言编写的OS,所以不能抛出C++类型的异常。这不是说没有软件驱动的异常,只是它们不是C++中“尝试/捕获”的例外类型,没有某种翻译。 在第一个示例中,操作系统肯定涉及[我知道它们如何工作的所有操作系统]由于除法零导致所有具有除法功能的机器都出现了硬件异常,因此OS需要参与。而且,这将以相同的方式编译和失败,无论是C++、C还是在汇编程序中编写相同的东西。对于大多数操作系统,它们会向程序发送信号,但由于没有C。对于处理信号的ode,您的代码很可能只是中止,告诉操作系统发生了奇怪的事情,它正在放弃,甚至懒得解开堆栈


    在第二种情况下,根本不涉及操作系统。在对main的调用中有一个“try-catch”块,它表示“Oops,有人抛出了未捕获的东西,让我们退出”。唯一涉及操作系统的部分是“退出此进程”,这当然需要由操作系统来完成,尽管我相信大多数操作系统,但从“应用程序的起始地址”返回也会有同样的效果。

    C++异常是语言的一部分,由语言标准定义,由编译器和运行库实现。还有其他
    异常e> CPU检测到的故障,如除以零或取消引用空指针,都是语言标准中的示例。这些故障在处理器术语中是
    故障
    ,例如在x86上触发一个
    故障处理程序
    ,然后由操作系统提供服务。然后操作系统可以选择将该故障报告给在UNIX上,它是用<代码>信号< /代码>完成的。如果您的进程安装了<代码>信号处理程序< /C> >代码> SigSeV,它可以处理当进程取消空指针时CPU产生的故障…该机制与语言定义的C++异常分离。

    在你的例子中,当一个C++程序<代码>抛出异常时,这完全是由编译器生成的代码和语言运行库所处理的,没有必要的内核调用,处理器也没有硬件故障。

    快速回答:C++异常完全是过程驱动的。但是我还没有足够的知识来处理。进一步讨论如何正确地执行异常。编辑:在第一种情况下,进程接收到一个可以转换成C++异常的信号。examples@B我认为,通过crash,Xploit意味着带着非0错误代码退出。第二个调用abort(在标准的某个地方定义),第一个是HWsignal@B对不起,没有达到返回0。这就是我的意思。+ 1,我还补充说C++异常有平台特定的实现,通常基于OS提供的设施。@ LAPK的评论似乎直接与答案相反:“基于”!“=没有任何方式参与”。我的意思是,C++的规范声明了C++异常是如何操作的,它独立于操作系统。如果编译器选择使用一些操作系统,那么它是免费的,但是这是一个实现细节——你不能依赖它。m/语言异常。足够抽象且格式良好。
    #include <exception>
    
    int main(){
    
        throw 11;  //did the process tell the OS it needs to end?
    
        return 0;
    }