質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

4回答

7801閲覧

LINUX上のアプリの戻り値(終了コード)の定義

dotkind

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2018/11/30 02:27

組み込みLinux上でのアプリケーションを作成しています。

意図せぬエラーでアプリが落ちた時の挙動について質問です。

例えば、以下の様なアプリを実行すると、メモリ二重開放でエラーになります。
*** Error in `/tmp/app': double free or corruption (top): 0x003b5008 ***
Aborted

そのとき、アプリの戻り値(終了コード)を確認すると0x86になっておりました。
この値はどこに定義されているのでしょうか?

終了コードを数種類利用し、
終了の状態を外部に伝えたいと考えており、通常の成功の0以外で使える数値(エラーに割り当てられていない数値)が何かを知りたいと思っております。

C言語

1int main() 2{ 3 FILE* fp = fopen("/tmp/app", "r"); 4 fclose(fp); 5 fclose(fp); //←ここでメモリ二重開放のエラーが出る 6 7 return 0; 8}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

プログラムがabort(異常終了)した場合には、_exitシステムコールが呼ばれないため、通常の終了コードはセットされません。

何となくでいうと、0x86は、SIGABRTのシグナル番号である0x06に、下から4ビット目が立った値ではないでしょうか。

追記:

そう思って調べてみると、これは終了コードを受け取るシェルの側の動作のようですね。ash・bash・zshあたりは128+シグナル番号、ksh93あたりは256+シグナル番号、という説明がありました。

投稿2018/11/30 03:09

編集2018/11/30 03:59
emasaka

総合スコア524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dotkind

2018/11/30 04:43

情報ありがとうございます。 大変参考になりました。
guest

0

sysexits.hには、プログラムがexit()で外部に返す値が定義されています。
但し、これに準拠しないプログラムも多く存在するので確認が必要です。

sysexits.hより抜粋

#define EX_OK 0 /* successful termination */ #define EX__BASE 64 /* base value for error messages */ #define EX_USAGE 64 /* command line usage error */ #define EX_DATAERR 65 /* data format error */ #define EX_NOINPUT 66 /* cannot open input */ #define EX_NOUSER 67 /* addressee unknown */ #define EX_NOHOST 68 /* host name unknown */ #define EX_UNAVAILABLE 69 /* service unavailable */ #define EX_SOFTWARE 70 /* internal software error */ #define EX_OSERR 71 /* system error (e.g., can't fork) */ #define EX_OSFILE 72 /* critical OS file missing */ #define EX_CANTCREAT 73 /* can't create (user) output file */ #define EX_IOERR 74 /* input/output error */ #define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */ #define EX_PROTOCOL 76 /* remote error in protocol */ #define EX_NOPERM 77 /* permission denied */ #define EX_CONFIG 78 /* configuration error */ #define EX__MAX 78 /* maximum listed value */

ちなみにerrno.hは、システムコールがエラーで返ってきた時にerrnoにセットされる値なので、終了コードとは別物です。

投稿2018/11/30 04:07

shozi3

総合スコア691

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dotkind

2018/11/30 04:44

ご回答ありがとうございます。 今後はsysexits.hも参考にするよういたします。
guest

0

ベストアンサー

終了コードが128を超える場合は、シグナルによる割り込み終了です。
終了コード=128+シグナル番号です。
今回は、終了コード=0x86=134とのことですが
0x8B=139ではないでしょうか。(こちらで確認すると139で終了しています)
134なら134-128=6(SIGABRT 6 Coreabort(3) からの中断 (Abort) シグナル)
139なら139-128=11(SIGSEGV 11 Core 不正なメモリー参照)
となります。
下記URLを参照ください。
https://www.pistolfly.com/weblog/2014/04/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E7%B5%82%E4%BA%86%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C128%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E3%82%B7%E3%82%B0%E3%83%8A.html

https://linuxjm.osdn.jp/html/LDP_man-pages/man7/signal.7.html

投稿2018/11/30 03:51

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dotkind

2018/11/30 04:42

ご回答ありがとうございます。 追加の質問がございます。 128以下の場合は、どの様な意味合いになるのでしょうか?
tatsu99

2018/11/30 05:19

can110さんが提示されている一覧があるかと思いますが、紳士協定かと思いますので。 あなたが作成するアプリケーションで自由に決めてよいかと。 0は正常にし、以外は数値が大きくなるほど重度のエラーになるように、きめれば良いとおもます。 アプリケーション間で齟齬がなく、統一的に決めれば、問題ないと思います。
guest

0

UNIX系のエラー一覧を参照ください。
実際には各プログラムで決めているので、上記の一覧とは異なる意味を表している可能性は十分にあります。

投稿2018/11/30 02:31

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dotkind

2018/11/30 04:42

情報ありがとうございます。 大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問