電子書籍の厳選無料作品が豊富!

C言語ではシグナル、C++では例外という概念が存在しますが、
この2つに違いはあるのでしょうか?
シグナルはシグナルハンドラで捕捉できるし、
例外もcatchして例外処理が可能ですし…
どのような違いがあるか、お教えいただければ幸いです。

A 回答 (5件)

以下のURLは、直接関係ないですけど、なかなかおもしろいですよ^^



 http://d.hatena.ne.jp/yupo5656/archive

執筆に参加したという『Binary Hacks ― ハッカー秘伝のテクニック100選』もまずまずでした^^
    • good
    • 0

まず、C言語の標準規格では、signalおよびraise関数が規定されています。

すなわち、言語仕様の中にシグナルが含まれています。ただし、言語そのものではなく、ライブラリとして実現しています。

標準規格で規定されているシグナルのうち、非同期で発生する可能性があるのはSIGINTだけですが、これもどんな風に実装されるかは処理系定義ですし、raise関数を用いてのみ発生させることができる仕様であったとしても規格の要件は満たしています。
そして、これら標準ライブラリの実現方法は、OSの機能を使ってもよいですし、使わなくても構いません。

シグナルというものは、ある事象が発生したときに、単に特定の関数を呼び出すだけです。raiseまたはabortの結果としてシグナルハンドラが呼び出された場合を除き、longjmpで脱出することも、exitやabortで終了することもできません。もちろん、シグナルハンドラの中から例外を送出することもできません。

一方、C++の例外は完全に同期的に発生します。そして、関数の枠組みを超えて、呼出し元の関数へ制御を移します。その際、途中に存在する自動オブジェクトは自動的に解体されます。
例外は特定の関数を呼び出すだけではありませんので、例外ハンドラの中でできることはかなり自由度が高くなっています。
    • good
    • 0

C言語のシグナルはOSの機能であって言語の機能ではありません。

OSの機能をライブラリを通じて使用しているだけです。従って、LinuxとWindowsでは、まったく機能や使い方が違ってきます。というか、Windowsに同じ意味のシグナルはありません。

それとC++の例外try~catchは、一般保護例外などの言語管理外の異常はキャッチしてくれません。言語仕様内の例外、newの失敗などを拾ってくれるだけです。でもシグナルなら一般保護例外を拾ってくれます。これはOSの機能だからです。
    • good
    • 1

あぁ、それから、シグナルは、他のプロセスから該当プロセスにシグナルを送ることができますが(raise()などで、自分でも送れますけど^^)、例外はたぶん標準的な方法では無理でしょう。

あと、シグナルはハンドラで処理した後、シグナルを受け取った処理ポイントに戻りますが(システムコール中にシグナルを受けた場合や、非アトミック的な操作中にシグナルを受けた場合など、いろいろと複雑ですが)、例外は例外ハンドラで処理しても例外を投げたところのポイントへは戻りません。

シグナルはできれば使わないほうがいいです。使うならきちんとした書籍を読んで理解して、処理系・環境依存の動作などを確認して使うのがいいと思います。
    • good
    • 0

シグナルは非同期的ですが、例外は同期的です。

C++が言語的にサポートしてるのは例外で、スタックの巻き戻し時にローカル変数のデストラクタが起動されることになってます。例外処理で間に合うのなら、シグナルは使わないほうがいいと思います。

ちなみに、C言語のライブラリには、C++の例外処理と似たようなものに、longjmp() がありますけど、こちらは、スタックの巻き戻しのみを行うものだと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!