UNIXで、CよりOracleのSQL*Loaderを使用しています。
CSVファイル->Oracleのテーブル
でデータを挿入する際に、テーブルのカラムサイズが
足りずにエラーが発生し、最大エラー件数を超えたので
処理がエラーで終了しました。

その際に、
セグメンテーション・フォールト(coredump)
というメッセージが表示されます。

ついでに補足するならば、Cのプログラムを直接起動すると、
上記エラーメッセージ出力後、プロセスは終了しますが、
別プログラムより起動した場合(UID=root)、
プロセスが終了してくれません。

上記メッセージの意味と、なぜrootからだと
プロセスが終了しないのか、が分かりません。
どなたかお分かりになる方、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

セグメンテーション・フォールトは、プログラムが、アクセスを禁止されて


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

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

大変助かりました。どうもありがとうございます。

お礼日時:2001/09/05 19:26

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qセグメンテーション違反について

C言語であるプログラムを作っています。コンパイルは上手くできるのですが、実行するとセグメンテーション違反と出てしまいます。それもセグメンテーション違反と出るときと出ないときがあり困っています。そこでプログラム中のどこがセグメンテーション違反を指しているのか知りたいのですが、何かセグメンテーション違反の場所を教えてくれるようなオプションはないでしょうか? プログラムソースを見てもらうのが一番いいと思いますが、行数が1000行を超えているので断念しました。OSはLinuxでコンパイラはgccです。どなたかご教授お願いします。

Aベストアンサー

デバッガを使おう。
「gcc デバッガ」で検索すると色々出てくる。

QLinuxサーバーrootからのメッセージ

いつもお世話になっています。

Turbo Linux Server 6.1Jから、ftp版のTurbo Linux Server 6.5にアップグレードしました。

昨日、INSからADSL固定IPサービスへ移行して、各種のサーバーを立ち上げて、rootからのメッセージをクライアントPCから受け取りました。
その中に、下記のエラーが毎時間、1件以上出ているのですが、これはどのような意味で、修正する方法があれば是非教えてくださいお願いします。

Dec 5 12:01:00 xx CROND[2361]: (root) CMD (run-parts /etc/cron.hourly)
        :
Dec 5 11:01:59 xx ipop3d[2246]: Mailbox vulnerable - directory /var/spool/mail must have 1777 protection

Aベストアンサー

No.2 の回答に補足を。

ranx> このディレクトリはメールの保管場所だと思います。
ranx> そのアクセス権を1777にしてしまっては、誰でもアクセス
ranx> できることになってしまい、かえって危険です。

/var/spool/mail は、メールボックスファイルが置かれるディレクトリです。
だから、メールを扱うプログラムがアクセスできるようにアクセス権限をつける
のが普通です。

制限をかけるのは、このディレクトリに配置されるメールボックスに対して、です。
/var/spool/mail の下を見てみると分かると思いますが、メールボックスがそれぞれ
所有者とグループに読み書きの権限がついていて、グループが mail になっている
はずです。

で、ディレクトリのモードが 777 ではなく 1777 になっているのがミソなん
です(スティッキィビットといいます)。

メールを扱うプログラムが本人か root だけだと、バックで動くプログラムを
全て root 権限で動作させることになってしまいます。そのセキュリティホールを
つかれると、root 権限をのっとられてしまうので、できるだけプログラムは
root 権限で動かさない方が良いんです。

ディレクトリにスティッキィビットがついていると、そのディレクトリ配下の
ファイルは root じゃなくても、ファイルの所有者・ディレクトリの所有者・書き込み
可能の *どれかの* 条件を満たしていると更新ができます。

そうすることで、メールを扱うプログラムを root 以外の権限で動かすことができ、
最悪、権限をのっとられても、たいした悪さができないようにリスクを軽減すること
ができます。

No.2 の回答に補足を。

ranx> このディレクトリはメールの保管場所だと思います。
ranx> そのアクセス権を1777にしてしまっては、誰でもアクセス
ranx> できることになってしまい、かえって危険です。

/var/spool/mail は、メールボックスファイルが置かれるディレクトリです。
だから、メールを扱うプログラムがアクセスできるようにアクセス権限をつける
のが普通です。

制限をかけるのは、このディレクトリに配置されるメールボックスに対して、です。
/var/spool/mail の下を見てみると分かる...続きを読む

QPHPのセグメンテーション違反に対する例外処理について

PHPのセグメンテーション違反に対する例外処理について

再帰呼び出しのプログラム(error_seg.php)を作成し、Linuxのシェルで
 $ php error_seg.php
と実行しました。

実行環境:
PHPのバージョン:5.2.10
Linuxのバージョン:2.6.18-164.15.1.el5 (mockbuild@builder16.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Wed Mar 17 11:37:14 EDT 2010

プログラムは下記の通りです。

<?php
$cnt=0;

function func(){
global $cnt;
$cnt++;
print $cnt . "回目の呼び出し\n";
func();
}

try{
func();
}catch(Exception $e){
echo "例外発生:" . $e->getMessage()."\n";
}
?>

※このプログラムは、
  http://d.hatena.ne.jp/syonbori_tech/20090414/1239717538
 のサイトを参考にして作りました。

この結果、
 1回目の呼び出し
 2回目の呼び出し
 ・・・
 26187回目の呼び出し
 26188回目の呼び出し
 セグメンテーション違反です
と表示され、セグメンテーション違反を再現させました。

※何回目でセグメンテーション違反が発生するかは、
 その都度異なります。

プログラム中で、try-catchの例外処理を入れたのですが、
例外処理されないようです。セグメンテーション違反に対して
例外処理をすることはできないのでしょうか。
できるとすれば、どのように記述をすればよいでしょうか。

PHPのセグメンテーション違反に対する例外処理について

再帰呼び出しのプログラム(error_seg.php)を作成し、Linuxのシェルで
 $ php error_seg.php
と実行しました。

実行環境:
PHPのバージョン:5.2.10
Linuxのバージョン:2.6.18-164.15.1.el5 (mockbuild@builder16.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Wed Mar 17 11:37:14 EDT 2010

プログラムは下記の通りです。

<?php
$cnt=0;

function func(){
global $cnt;
$cnt++;
print $cnt . "回目の呼び出し\n";
func();
}

...続きを読む

Aベストアンサー

PHPプログラムレベルの例外ではなくて、PHP自体が異常終了してしまっているのだと思いますので、PHPプログラム内で捕まえることは不可能です。

他の言語では、スタックの不足を事前検知して、プログラム内で例外を上げるものもあるようですが、PHPはスタックの不足を事前検知せず、不足した時点でPHPがこけるという事でしょう。

QファイルアクセスしたUIDの履歴を取りたい

OSはSolaris8です。

そのファイルをアクセス(見るだけでも)したUIDが何かわかる、うまい方法はないでしょうか。

OSの機能にあればいいですけど
サードパーティの製品でも構いません。

Aベストアンサー

SunShieldって、標準でついてませんでしたっけ?

参考URL:http://docs.sun.com/?l=ja&q=sunshield&p=/doc/806-2723

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

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

Aベストアンサー

似たような質問を発見しました。以下のURLを参考にしてみてはどうでしょうか?

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=715484

Qエラーメッセージのコピー

エラーメッセージのダイヤログボックスの文字を手軽に選択してメモ帳にコピーして貼り付けるにはどうすればいいでしょうか?windows98 2000 XP 2003server などについておしえていただければ幸いです。

Aベストアンサー

私は【窓ストーカー】というフリーソフトを使用しています。
文字にリンクが張ってある場合、タグが入ってしまうという欠点はあるものの、
簡単で使いやすくておすすめです

98、Me、XPの動作確認済みとのことです

参考URL:http://www.vector.co.jp/vpack/browse/pickup/pw5/pw005824.html

Q「セグメンテーション違反」について

参考書に載っていたプログラムを打ち込みながら勉強していたのですが、次のプログラムを動かしたときに「セグメンテーション違反」と出てきました。

/* 可変書式による印字_簡単な棒グラフ */
#include <stdio.h>
main()
{

char *f, *a;
int i;

f="%2d = %-20.1s\n";

a="********************";

for(i=1; i<10; i++){
*(f+11)=i+'0';
printf(f,i,a);
}
}

コンパイル後に、
「セグメンテーション違反です」
と、表示されて終わってしまいます。

何処が問題だったのでしょうか???教えて頂ければ幸いです。

Aベストアンサー

char *fが指している先は文字列リテラルです。
http://www9.plala.or.jp/sgwr-t/c/sec10-3.html

文字列リテラルは書き換えのできない領域に置かれることの方が多いですから書き換えようとするとエラーになります。
ついでに…そんな例の載っているような参考書は使用しない方がよいかと。

char f[]="%2d = %-20.1s\n";
だったら動作するかも知れません。

Qエラーメッセージ

Debian GNU/Linux
をFDでインストールしようとしています。
そこでhttp://www.ep.sci.hokudai.ac.jp/~inex/y2002/0110/Debian_install/install.html
を見てインストールをやっています。そこで質問なのですが、
rescueディスクでブートさせて
 -------------------------------------------------------------------
 Insert root floppy disk to be loaded into RAM disk and press ENTER
 -------------------------------------------------------------------
とでて、指示通りにrootディスクに入れ替えエンターを押したところ、
 -------------------------------------------------------
 request_module[block-major-2]: Root fs not mounted
 apm: BIOS version 1.2 Flags 0x02 (Drivet version 1.13)
 apm:disabled on user request.
 VFS: Insert root floppy press ENTER
 -------------------------------------------------------
とでます。とりあえずエンターを押せということなので更に押すと、
 -------------------------------------------------------
 request_module[block-major-2]: Root fs not mounted
 VFS: Cannot open root vevice 02:00
 Kernel panic: VFS: Unable to mount root fs on 02:00
 --------------------------------------------------------
となり、固まってしまいます。
ROOTディスクがマウントできていない?
ROOTディスクの作成は間違っていないはずです。
まったく原因がわからず困っています。
どなたかお願いします。

インストールしようとしているPCは
http://www3.toshiba.co.jp/pc/catalog/oldpc/libretto/lib100.htmです。
HDのパーティションは何もいじってません。
FDはPCカードからの出力となっています。

Debian GNU/Linux
をFDでインストールしようとしています。
そこでhttp://www.ep.sci.hokudai.ac.jp/~inex/y2002/0110/Debian_install/install.html
を見てインストールをやっています。そこで質問なのですが、
rescueディスクでブートさせて
 -------------------------------------------------------------------
 Insert root floppy disk to be loaded into RAM disk and press ENTER
 -------------------------------------------------------------------
とでて、指示通りにrootディスクに入...続きを読む

Aベストアンサー

http://oshiete1.goo.ne.jp/kotaeru.php3?q=471123 の方ですよね.
CDもネットワークもなし,FDもPCMCIA接続とは,かなりきつそうです.
起動ディスクでカーネルが起動しても,その後FDは認識されないでしょう.
googleさんに訊ねると

http://lists.debian.or.jp/debian-users/199805/msg00251.html

というのがありましたが,参考になるかどうか.

以下は思いつきですが,

・DOSのFDで起動(fdisk, sys, format など,必要なツールを組み込んでおく)
・とりあえず,HDDの先頭に小さなDOSパーティションを作りアクティブにする.
・sys c: とかやって,HDDから起動できるようにする.
・後は必要なものをFDでHDDにこつこつコピーして,HDD起動後 loadlinを使ってなんとか debianをインストールする.

一時的にでも,誰かから借りるなどして,リムーバブルケースが使えれば,HDDを取り外して別のPCでコピー作業ができますよね.
そうなると,ハードディスクインストールができるので,ディストリビューション選択の幅も広がると思うんですけどね.

http://oshiete1.goo.ne.jp/kotaeru.php3?q=471123 の方ですよね.
CDもネットワークもなし,FDもPCMCIA接続とは,かなりきつそうです.
起動ディスクでカーネルが起動しても,その後FDは認識されないでしょう.
googleさんに訊ねると

http://lists.debian.or.jp/debian-users/199805/msg00251.html

というのがありましたが,参考になるかどうか.

以下は思いつきですが,

・DOSのFDで起動(fdisk, sys, format など,必要なツールを組み込んでおく)
・とりあえず,HDDの先頭に小さなDOSパーティ...続きを読む

Qc++でセグメンテーション違反

c++言語を勉強しているものです。
配列を関数の引数として扱うプログラムを作ろうとしているのですが、
コンパイルが通ったかと思えば実行すると
「セグメンテーション違反です」
と表示されて異常終了してしまいます。

原因がさっぱりわかりません。

OSはLinux(RED HAT ENTERPRISE LINUX 5)、コンパイラはg++(バージョン 4.1.2)です。

これがソースコードです。

#include <iostream>
using namespace std;

#define BUFSIZE 1024
#define MSG "msg"

void test(char buf[])
{
//bzero(buf,BUFSIZE); LEGACY
memset(&buf, 0, BUFSIZE);
sprintf(buf, "%s\n", MSG);
cout << buf;
cout << "(Terminated)" << endl;
return;
}

int main()
{
charbuf[BUFSIZE];

test(buf);
return 0;
}

c++言語を勉強しているものです。
配列を関数の引数として扱うプログラムを作ろうとしているのですが、
コンパイルが通ったかと思えば実行すると
「セグメンテーション違反です」
と表示されて異常終了してしまいます。

原因がさっぱりわかりません。

OSはLinux(RED HAT ENTERPRISE LINUX 5)、コンパイラはg++(バージョン 4.1.2)です。

これがソースコードです。

#include <iostream>
using namespace std;

#define BUFSIZE 1024
#define MSG "msg"

void test(char buf[])
{
//bzero(buf,BUFSIZE); LEGAC...続きを読む

Aベストアンサー

よく「コンパイルが通ったのに実行時エラーが出る」という質問を見かけますが、
「コンパイルが通った」は「文法的に間違ってない」ことを保障するだけです。
プログラムそのものの誤りがないことを保障する訳ではありません。

memsetの第一引数の型void *はポインタ型ならなんでも受け入れるので、
プログラムの意図ではchar *を渡すところでchar **を渡してしまっても
コンパイルはできてしまう、ということです。

Q英語でのエラーメッセージ

パソコンにおいて、各エラーのメッセージが日本語で出ない理由は何でしょう? 英語に多少の心得はあっても、英文で表示が出た時点で絶望的な気分に成る方が大半だと思いますが、メーカー側がその辺りまで配慮しない理由を御存知のから、お知恵拝借。

Aベストアンサー

PC-9800シリーズ等の日本国内専用設計パソコンの時代と違い、今のWindowsパソコンはOSの動作していない時は基本的に英数字しか表示できません。
そのため、HDDがクラッシュした等の理由でWindowsが正常起動しない際のエラーメッセージは英語にせざるを得ません。


人気Q&Aランキング