
〇シェルスクリプト
#!/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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
Windows Formアプリからコンソ...
-
VisualStudio2022でC言語プログ...
-
大量のデータを読み込んで表示...
-
gccを行ってもexeファイルが生...
-
VisualStudioでC++クラスを追加...
-
ディスプレイの解像度とマウス...
-
逆コンパイルと逆アセンブルの...
-
10進数からN進数に変換するプロ...
-
プログラミングの課題がわから...
-
写真のプログラムは、1からnま...
-
C言語でファクト関数を使わずに...
-
【C言語】全角文字の配列を、全...
-
MACで動く実行ファイルをWindow...
-
C言語のことです。写真(見にく...
-
今ってプログラミング言語は何...
-
システムエンジニアの適正について
-
c言語
-
C言語について。
-
擬似コード
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
gccを行ってもexeファイルが生...
-
大量のデータを読み込んで表示...
-
visual studio 2022でのC#プロ...
-
C++でデスクトップGUIアプリ開...
-
【C言語】全角文字の配列を、全...
-
Windows Formアプリからコンソ...
-
VisualStudio2022でC言語プログ...
-
C#でログファイルにファイルパ...
-
C#でTreeViewのCheckBoxのサイ...
-
c#のTLS1.2での通信について
-
VisualStudioでC++クラスを追加...
-
C言語について。
-
int16_t の _t は何?
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
C言語の関数のextern宣言
-
c言語でイベントフラグを使った...
-
C言語 関数、変数の宣言について
-
[C言語]fputsとfprintfの違い
おすすめ情報
回答ありがとうございます。
ためしに実際にエラーが出ていたファイルをinput.datにcpしてプログラムを実行したのですが、問題なく実行されました。
現に、すべてのファイルでセグメンテーション違反のエラーが出ています><
エラーとは別件の件について
この後にもプログラムがあって、そこでそれぞれ元のファイル名の.pngのファイルにしているので問題ありません。なお、シェルスクリプトはcloudy_mitudoに似ているプログラム(処理が少し少ない)で確認済みです。
気遣い大変うれしいです。ありがとうございます。