セグメンテーション・フォールトとは?データ挿入時のエラーとプロセス終了の問題について

このQ&Aのポイント
  • UNIXで、CよりOracleのSQL*Loaderを使用してデータを挿入する際に、テーブルのカラムサイズ不足によりエラーが発生し、処理がエラーで終了することがあります。この際、セグメンテーション・フォールトというメッセージが表示されます。
  • また、Cのプログラムを直接起動するとエラーメッセージが出力された後でプロセスは終了しますが、別プログラムよりroot権限で起動した場合、プロセスが終了しないことがあります。なぜrootからだとプロセスが終了しないのかは不明です。
回答を見る
  • ベストアンサー

セグメンテーション・フォールト

UNIXで、CよりOracleのSQL*Loaderを使用しています。 CSVファイル->Oracleのテーブル でデータを挿入する際に、テーブルのカラムサイズが 足りずにエラーが発生し、最大エラー件数を超えたので 処理がエラーで終了しました。 その際に、 セグメンテーション・フォールト(coredump) というメッセージが表示されます。 ついでに補足するならば、Cのプログラムを直接起動すると、 上記エラーメッセージ出力後、プロセスは終了しますが、 別プログラムより起動した場合(UID=root)、 プロセスが終了してくれません。 上記メッセージの意味と、なぜrootからだと プロセスが終了しないのか、が分かりません。 どなたかお分かりになる方、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

セグメンテーション・フォールトは、プログラムが、アクセスを禁止されて いるメモリー領域にアクセスしようとしたということです。大抵はプログラムの バグです。 coredumpは、OSがその時のメモリーの状態をcoreというファイルに保存した ということです。 UIDがrootの場合にプロセスが終了しない理由は、はっきりとはわかりませんが、 上記のことを考えれば、root権限ならばアクセスできるところにアクセスして いるのかもしれません。とすると、プロセスが終了しないのは、結構危険な 状態なのかもしれません。

m_miyachan
質問者

お礼

早速のご回答ありがとうございます! プログラムを調べたところ、ご指摘の通り、バグがありました。 修正後は正常に動いています。 プロセスが終了できなかったのも、おそらくranxさんの 予想通りではないかと思われます。 大変助かりました。どうもありがとうございます。

関連するQ&A

  • malloc呼び出し時のセグメンテーションフォルト

    UNIX(HP-UX)上でCプログラムを組んでおります。 その際、mallocでセグメンテーションフォルトが起こりました。 mallocでセグメンテーションフォルトが起こった場合、どのように調査するのか、また実際どのような原因で起こりうるのか教えていただけますでしょうか?

  • セグメンテーションフォルトが起きます。

    gccでセグメンテーションフォルトが起きます。 gdbでデバッグしたのですがどうもSTLのコードでセグメンテーションフォルトがおきているようなのです。 そんなことってあるのでしょうか。 何かわかる方アドバイスお願いします。 以下はgdbで実行した結果です。 Program received signal SIGSEGV, Segmentation fault. CNFLiteral::CNFLiteral (this=0x16eec0, cnf=@0x16ef80) at /usr/include/c++/3.3.3/bits/stl_iterator.h:642 642 base() const { return _M_current; }

  • セグメンテーション違反とは??

    linuxでC言語のプログラムを構築しています。 gccでコンパイルしたときにセグメンテーション違反という エラーが出てしまいます。 セグメンテーション違反とは一体なんの ことなんでしょうか? メモリのことだと思ってるんですが、原因がよくわかりません。C言語初心者なので わかりやすく教えて頂けるとありがたいです。

  • セグメンテーションエラー?

    Linuxを勉強しようと思って Red Hat Linux 7.3入門キットという本を買って、 読みながらインストールして起動してみると、 いきなり アプリケーションエラー「Panel」プロセス 1231 って出てきます。 それでその下にセグメンテーションエラーです、って言われました。 どうやらWindowsでいう、一番下のタスクバーが出てこないみたいなんですが。 何が悪くて、どう解決すればよいのかさっぱり分かりません。 ログアウトすりゃ出来やしない状況です。 まぁ、いざとなりゃ電源ぶち切りゃ良いんですけど、 やっぱしやりたくない。 どなたかヘルプ下さい。

  • セグメンテーションエラー

    初めまして。 余り詳しくないのですが、Cでバイナリファイルを読み込み、10分ごとにDBに書き込む永久ループのプログラムを作っています。 コンパイルも出来て、動くのですが、3回ぐらい書き込むと セグメンテーションエラーで止まります。時には、6-7回書き込めたりします。 DBに書き込むところを省いても、エラーが出てしまうのですが、どのような部分を調べていったらいいですか?

  • 「セグメンテーション違反です」の意味を教えて下さい

    OS:RedHatLinux7.2 bindのバージョンを8.3.1→8.4.1にバージョンアップしました。 namedコマンドでbindを起動しようとした際、 "1091 セグメンテーション違反です named" と表示され、dnsが起動しません。 インターネットで検索しましたが、関連のありそうな ページを見つけることができませんでした。 どなたか、このエラーメッセージを見たことのあるかた いらっしゃいませんか?

  • セグメンテーションエラーの原因がわからず困っています。

    こんにちは。 プログラムを実行すると「セグメンテーションエラー」と表示されほとほと困っています。力を貸して頂けないでしょうか。 以下がそのプログラムです。 #include<string.h> #include<unistd.h> #include<errno.h> #include<signal.h> #include<sys/types.h> main(){ FILE *fp,*fp2; int a; pid_t pid; pid = fork(); if(pid == 0){ fp = popen("tcpdump 'tcp[13] & 255 == 2' > file.txt","r"); system("sleep 1"); kill(pid,SIGTERM); } else{ fp2 = popen("wc -l file.txt","r"); fscanf(fp2,"%3d",a); printf("%d",a); } } プログラムの内容は、子プロセスとして動かしたtcpdumpにより出力されたfile.txtの行数を表示するものです。 tcpdumpを子プロセス化したのは、killコマンドで終了しないと止まらないからです。 以上で何か気づかれた事等ありましたら、是非ご教授いただきたいのですが可能でしょうか。環境はCentosです。どうぞよろしくお願いします。

  • RPGツクールローダーで2度目がエラーに

    一旦遊んで終了し、もう一度続きをはじめようとすると、 c:\Program Files\rpg_loader\Data\Runtime\2000_151\dRPG_RT.exeから c:\Program Files\rpg_loader\Data\temp\RPG_RT.exeへのコピーが失敗しました。と出てゲームできません。 パソコンを再起動すれば、1回だけ出来ます。 tempフォルダの属性が、書き込みオンリーなので変えても ゲームを始めようとすると上記のエラーになってフォルダを見ると 書き込みオンリーに戻っています。 何か方法があったら教えてください。

  • デバッグ終了後、再度デバッグ動作できない

    簡単な電卓のプログラムを組んで、ビルド後デバッグして、一旦デバッグ終了のためにフォームの右上の×ボタンで終了し、再度デバッグ動作を実行するとデバッグに入れなくなります。 一旦Code Gear C++ Builder 2009を終了使用とすると、”デバッグを終了しますか?”というメッセージボックスが出てきます。 そのままIDEの終了動作を行うと”デバッグプロセスを初期化できません のプロセスを終了する際にデバッガで致命的なエラーが発生しました。作業中のファイルを保存し CodeGear C++ Builderを再起動してください。” このようなメッセージボックスが出てきて強制終了してから起動しないかぎり再度デバッグ動作ができないのですが、解決方法ご存じの方いらっしゃいませんでしょうか? 現在使用しているのはCode Gear C++ Builder 2009 です。

  • Oracle VM VirtualBoxについて

    先日までOracle VM VirtualBoxを使ってc++でプログラムを書いていたのですが、Oracleを閉じる際、保存が完全にされない内に強制終了してしまい、それ以降、起動することができなくなってしまいました。Oracleは仮想アプライアンスのインポートをして起動させて使っていたはずなんですが... 分かりにくい文章ですみません。 どうすればまた、起動することができるようになりますか?