
〇シェルスクリプト
#!/bin/sh
mkdir 2.5
files=(`ls *.dat -1`)
#必要なファイルの振り分け
for file in ${files[@]}
do
important=`od -tu2 $file | awk 'NR==1' | awk '{print $3}'`
if [ "$important" = 455 ] ; then
cp $file 2.5
fi
done
#実行するファイルのディレクトリにて画像処理
cd 2.5
cp(cpで実行プログラムをコピー)
files=(`ls *.dat -1`)
for file in ${files[@]}
do
cp $file input.dat(実行するプログラムに対応するファイルに変更)
./cloudy_mitudo(画像処理のプログラム)
convert output.txt now.png
done
上記のプログラムを走らせたところ
./(シェルスクリプト名).sh: line 20: 19956 セグメンテーション違反です ./cloudy_mitudo
というエラーがでました。
普通に./cloudy_mitudoと実行した場合にはエラーが出ずにちゃんと画像処理が行えますが、シェルスクリプトにして実行した場合にセグメンテーション違反になってしまいます。
原因、対応策案をご教授いただきたいです。よろしくお願いします。
No.4ベストアンサー
- 回答日時:
いまひとつわからないのですが。
(1)元々 /foo/ ディレクトリに cloudy_mitudo がある
(2) cd /foo/ 後に ./cloudy_mitudo は正常に動作する
(3)「/bar/hoge.dat を /bar/2.5/ に コピー
cd /bar/2.5/ で移動
/bar/2.5/ に /foo/cloudy_mitudo もコピー
hoge.dat をinput.dat にコピー
./cloudy_mitudo を実行 」というシェルスクリプトで、./cloudy_mitudoがSegmentation Fault
↑以上が、質問にある状況
(4) /bar/hoge.dat を /foo/input.dat コピーして (cd /foo/ 後に) ./cloudy_mitudo は正常に動作
↑ 補足にある「ためしに実際にエラーが出ていたファイルをinput.datにcpしてプログラムを実行した」の具体的な内容
現状はこれで合ってますか?
もしそうなら、 元のディレクトリに依存する何かがあるのでしょう。
それ以上は、cloudy_mitudoのソースを見ないとわかりません。
また、現状がこれと異なるのなら、具体的に詳しく書いてください。
例えば 上記の (4) ではなく
(4') (3)の後に残ってる /bar/2.5/ ディレクトリで、 hoge.dat を nput.dat コピーしての ./cloudy_mitudo は正常に動作 ← 補足にある「ためしに実際にエラーが出ていたファイルをinput.datにcpしてプログラムを実行した」の具体的な内容
だとしたら、調べるべきものが違ってきます。
前回
> cloudy_mitudo のエラー処理を強化して、どこで発生しているか調べ、それが何故起こるか仮説を立て、仮説が正しいかを調べ、何故そうなるかを考え... と、真因に辿りつくまで地道にいくしかありません。
と書いた通りです。
サンプルプログラムでは、「エラーは起こらない」ことを前提に、エラー処理を省略しているものが多いです。
使ってる関数のマニュアルをよく読んで、エラーがあったら止めるように cloudy_mitudo を作り変えましょう。
また、処理の途中に途中経過を出力するようにして、どこでエラーになったいるか、その直前でどんなことが起こっているか確認するもの手です。
(俗にprintfデバッグと呼ばれるやつです)
回答ありがとうございます。
現状としては(1)~(4)であっています。
ディレクトリに依存での間違いでした。
必要なファイルを一つ見落としていてそのためにそのファイルが読み込めなくてセグメント違反になっていました。
助かりました。ありがとうございます。
No.2
- 回答日時:
ごめん, その補足の意味が分かんない.
ためしに実際にエラーが出ていたファイルをinput.datにcpしてプログラムを実行したのですが、問題なく実行されました。
現に、すべてのファイルでセグメンテーション違反のエラーが出ています><
って何を言ってるんですか? 「すべてのファイルでセグメンテーション違反のエラーが出ています」っていう状態を「問題なく実行されました」と呼ぶことは非常に珍しいと思いますよ.
ちなみにちょっと確認.
「シェルスクリプトにして実行した場合にセグメンテーション違反になってしまいます」ということは, ここにあるコマンド群を全部手で売っていった場合には「セグメンテーション違反」にはならない, ということですか?
No.1
- 回答日時:
何かが違うとしか言いようがありません。
例えば、
fp=fopen("input.dat","r") などとしてあって、 それが成功しているかどうかを確かめずに、fp=NULLのままfreadしている
とか
特定のファイルを読んだときだけエラーになる。「普通に./cloudy_mitudoと実行した場合」はエラーにならないinput.datを読んでいる
とか。
cloudy_mitudo のエラー処理を強化して、どこで発生しているか調べ、それが何故起こるか仮説を立て、仮説が正しいかを調べ、何故そうなるかを考え... と、真因に辿りつくまで地道にいくしかありません。
例えば
cp $file input.dat(実行するプログラムに対応するファイルに変更)
を
cp -v $file input.dat
にすれば、どのファイルを処理したかがわかります。
いつエラーになるかもわかるはずです。
エラーとは別件で。
・convert output.txt now.png
だと、複数.datファイルがあっても、最後の結果しかnow.pngとして残りませんが、それでいいのですか?
・入出力ファイルをプログラム中で固定するのではなく、 標準入出力を使って cloudy_mitudo < 入力 > 出力みたいにするとか、コマンドライン引数を使って cloudy_mitudo 入力 出力 みたいにすると、こんな複雑なスクリプトにしないで済みます。
回答ありがとうございます。
ためしに実際にエラーが出ていたファイルをinput.datにcpしてプログラムを実行したのですが、問題なく実行されました。
現に、すべてのファイルでセグメンテーション違反のエラーが出ています><
エラーとは別件の件について
この後にもプログラムがあって、そこでそれぞれ元のファイル名の.pngのファイルにしているので問題ありません。なお、シェルスクリプトはcloudy_mitudoに似ているプログラム(処理が少し少ない)で確認済みです。
気遣い大変うれしいです。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
gccを行ってもexeファイルが生...
-
C言語について。
-
Windows Formアプリからコンソ...
-
C言語について(初心者)
-
C言語について。
-
C言語について。
-
VisualStudioでC++クラスを追加...
-
プログラムについて。
-
visual studio 2022でのC#プロ...
-
C言語の関数のextern宣言
-
プログラマー達は何故、プログ...
-
PIC12F1822でLED調光器を作りたい
-
最初に聞かれたこと
-
C言語 関数、変数の宣言について
-
プログラミングc++を全く分か...
-
あってる
-
DNCL(共テ用プログラミング言語...
-
DNCL(共テ用プログラミング言語...
-
C# で 数式文字列処理を処理す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
大量のデータを読み込んで表示...
-
c言語
-
gccを行ってもexeファイルが生...
-
visual studio 2022でのC#プロ...
-
【C言語】全角文字の配列を、全...
-
Windows Formアプリからコンソ...
-
VisualStudioでC++クラスを追加...
-
VisualStudio2022でC言語プログ...
-
プログラマー達は何故、プログ...
-
C++でデスクトップGUIアプリ開...
-
逆コンパイルと逆アセンブルの...
-
C言語について。
-
C#でTreeViewのCheckBoxのサイ...
-
C言語の関数のextern宣言
-
int16_t の _t は何?
-
C#でログファイルにファイルパ...
-
ディスプレイの解像度とマウス...
-
c言語でイベントフラグを使った...
-
C言語のことです。写真(見にく...
おすすめ情報
回答ありがとうございます。
ためしに実際にエラーが出ていたファイルをinput.datにcpしてプログラムを実行したのですが、問題なく実行されました。
現に、すべてのファイルでセグメンテーション違反のエラーが出ています><
エラーとは別件の件について
この後にもプログラムがあって、そこでそれぞれ元のファイル名の.pngのファイルにしているので問題ありません。なお、シェルスクリプトはcloudy_mitudoに似ているプログラム(処理が少し少ない)で確認済みです。
気遣い大変うれしいです。ありがとうございます。