• 締切済み

シグナルと例外の違い

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

みんなの回答

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.5

以下のURLは、直接関係ないですけど、なかなかおもしろいですよ^^  http://d.hatena.ne.jp/yupo5656/archive 執筆に参加したという『Binary Hacks ― ハッカー秘伝のテクニック100選』もまずまずでした^^

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

まず、C言語の標準規格では、signalおよびraise関数が規定されています。すなわち、言語仕様の中にシグナルが含まれています。ただし、言語そのものではなく、ライブラリとして実現しています。 標準規格で規定されているシグナルのうち、非同期で発生する可能性があるのはSIGINTだけですが、これもどんな風に実装されるかは処理系定義ですし、raise関数を用いてのみ発生させることができる仕様であったとしても規格の要件は満たしています。 そして、これら標準ライブラリの実現方法は、OSの機能を使ってもよいですし、使わなくても構いません。 シグナルというものは、ある事象が発生したときに、単に特定の関数を呼び出すだけです。raiseまたはabortの結果としてシグナルハンドラが呼び出された場合を除き、longjmpで脱出することも、exitやabortで終了することもできません。もちろん、シグナルハンドラの中から例外を送出することもできません。 一方、C++の例外は完全に同期的に発生します。そして、関数の枠組みを超えて、呼出し元の関数へ制御を移します。その際、途中に存在する自動オブジェクトは自動的に解体されます。 例外は特定の関数を呼び出すだけではありませんので、例外ハンドラの中でできることはかなり自由度が高くなっています。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

C言語のシグナルはOSの機能であって言語の機能ではありません。OSの機能をライブラリを通じて使用しているだけです。従って、LinuxとWindowsでは、まったく機能や使い方が違ってきます。というか、Windowsに同じ意味のシグナルはありません。 それとC++の例外try~catchは、一般保護例外などの言語管理外の異常はキャッチしてくれません。言語仕様内の例外、newの失敗などを拾ってくれるだけです。でもシグナルなら一般保護例外を拾ってくれます。これはOSの機能だからです。

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.2

あぁ、それから、シグナルは、他のプロセスから該当プロセスにシグナルを送ることができますが(raise()などで、自分でも送れますけど^^)、例外はたぶん標準的な方法では無理でしょう。あと、シグナルはハンドラで処理した後、シグナルを受け取った処理ポイントに戻りますが(システムコール中にシグナルを受けた場合や、非アトミック的な操作中にシグナルを受けた場合など、いろいろと複雑ですが)、例外は例外ハンドラで処理しても例外を投げたところのポイントへは戻りません。 シグナルはできれば使わないほうがいいです。使うならきちんとした書籍を読んで理解して、処理系・環境依存の動作などを確認して使うのがいいと思います。

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.1

シグナルは非同期的ですが、例外は同期的です。C++が言語的にサポートしてるのは例外で、スタックの巻き戻し時にローカル変数のデストラクタが起動されることになってます。例外処理で間に合うのなら、シグナルは使わないほうがいいと思います。 ちなみに、C言語のライブラリには、C++の例外処理と似たようなものに、longjmp() がありますけど、こちらは、スタックの巻き戻しのみを行うものだと思います。

関連するQ&A

  • 例外処理について

    C++初心者の者です。例外処理について質問があります。 例外処理の利点が明確に分かりません。 例外処理を使わなくても、if文でエラーを検出して、 エラー処理をすれば良いではないかと思ってしまいます。 例外処理が有効な状況を教えて頂ければ幸いです。 何卒、宜しくお願いします。

  • C# の例外処理について

    こんにちは。 C#の例外処理について質問させてください。 ある関数の内部において、一般的な例外をユーザー定義の例外に変えて投げ、 この関数の利用者には必ずそのユーザー定義の例外を処理するよう強制したいと思っています。 しかし、C#で関数の利用者に例外処理を強制させる方法が見つかりません。 そもそも、関数の利用者からは、その関数でどのようなユーザー定義の例外が投げられるかすらわからないように思います。 正しくcatchするには関数の中身を追うしかない?と疑問に思っています。 C#ではこのような場合、どうするのが一般的なのでしょうか? Javaでは例外処理の強制は簡単なので、構文が似てるだけに不思議に思っています。 基本的な仕様の見落としだったら申し訳ありませんが、よろしくお願いいたします。

  • C++の例外処理

    お世話になります。 現在C++でプログラミングを行っていますが、例外処理で困っています。 次のようなコードを書きました。 try{   m_Session.DestroyDatabasePool();   }catch(CException e){   m_Share.WriteLogFile("キャッチ中", LOG_INFO ); } しかし、これだとcatchが行われず、catch(CException e)部分を(...)にすると例外処理が実行されます。 例外の詳細を知りたいので、どうしても(CException e)で行いたいです。 説明が不十分かもしれませんが、何かご存知でしたら、ご教授お願いします。

  • 例外処理があまり使われない理由について

    C++でのプログラミングに関して質問です。 只今勉強中で色々な方のソースを拝見していますが、 参考書や解説サイトにはよく載っている「例外処理(tryとかcatchとか)」を記述したソースを殆ど見ないのですが、 例外処理は使わない方がいいのでしょうか? (処理速度が遅くなるとか、gotoのような暗黙の使ってはいけない理由があるのですかね?) 私自身も面倒なので例外処理は今まで書いたことがないのですが、 例外処理を記述する癖をつけた方がいいでしょうか?

  • 例外処理

    デバッグをしてみました。 すると,try・catch文までしか実行されていないことがわかりました。 public void init() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } 例外処理について調べてはみたものの、なぜこの部分で実行が止まってしまうのか、 解決につながるようなことが,みつかりません。 1.例外処理はどのような処理なのか 2.なぜ、try・catchで実行が終了してしまうのか 教えてください。

    • ベストアンサー
    • Java
  • VB2015 例外処理について

    Windows10、VS2015 Community上で、 以下の文で例外処理が発生しました。 PctureBox1.Image.Save("C:fileName.png) この処理は、PictureBox1.Image に画像を内製したものを一度HDDに保存し、 すぐにこのFileを読み込み、別の用途に供するために使います。 これを何度か繰り返していると、以下の例外処理(添付画像1)が発生して、 処理は中断されます。私には、この画像から例外の理由を判断することは 出来ませんでした。 そこで、例外処理を以下のように設けました。 Try PctureBox1.Image.Save("C:fileName.png) Catch ex As Exception System.Console.WriteLine(ex.Message) End Try この結果、処理は、継続され結果的には正しく終了しました。 ただし、例外処理を捕捉した時のMSGは以下の通りです。 'Plan2016.vshost.exe' (CLR v4.0.30319: Plan2016.vshost.exe): 'C:\WINDOWS \Microsoft.Net\assembly\GAC_MSIL\System.Drawing.resources \v4.0_4.0.0.0_ja_b03f5f7f11d50a3a\System.Drawing.resources.dll' が読み込まれました。 モジュールがシンボルなしでビルドされました。 ということで、例外処理を挿入したことにより、処理は最後まで出来ましたが、 このままで終了するには、寝覚めが悪いです。 考えられる問題と、これを回避する方法をご教授頂きたくお願いいたします。

  • 特定のSQLSTATE以外の例外処理について

    MySQLでは、OracleのEXCEPTION 文による例外処理のようなことはできないのでしょうか? 自分なりに調べてみたところ、MySQLではDECLARE ハンドラを使用して例外処理を行うと知りました。 ■MySQL :: MySQL 5.1 リファレンスマニュアル :: 17.2.8.2 DECLARE ハンドラより http://dev.mysql.com/doc/refman/5.1/ja/declare-handlers.html ■例外処理(DECLARE ... HANDLER) - bnoteより http://www.bnote.net/mysql/appendix/exception.shtml しかし、この場合だと、特定のSQLSTATE以外のエラーが発生した場合に、例外処理を行えなくて困っています。 特定のSQLSTATE以外の不足のエラーが起こった場合でも、例外処理を行いたい場合はどうすればいいのでしょうか?ご教授下さい。

    • ベストアンサー
    • MySQL
  • シグナルのマスクについて

    マスクされたシグナルはキューに溜まるものなのでしょうか、それとも破棄されるものでしょうか。 対象のシグナルはSIGALRMで、sigaction()で登録して, sighold()でブロックし、sigrelse()で解除しています。 マシンはSolaris8でC言語です。

  • アサーションと例外処理の違いについて

    アサーションと例外処理の違いは何ですか? あまり変わらないような気がするのですが?

    • ベストアンサー
    • Java
  • PHPの例外処理

    PHPの例外処理について教えてください function test() {   try{    $a = 10;    $b = 0;    $result = $a/$b;   }   catch(Exception $e){    //エラー処理   } } 上記でcatchが実行されるためにはどのようにすれば良いでしょうか?例えば if($b == 0) {   throw new Exception('例外'); } を「$result = $a/$b;」の前に書いておくなどすればcatchされるのはわかりますが、 想定されるすべての例外のthrow処理を記載するなんてことはしたくありません。 実行してエラーだったら自動的にthrowされる、なんていうことはPHPでは無理でしょうか?

    • ベストアンサー
    • PHP