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

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

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

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

Linux

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

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

6回答

8796閲覧

C, C++ main関数の戻り値 return 0 の実用方法

tf2014

総合スコア75

C

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

Linux

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

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

2グッド

6クリップ

投稿2017/08/08 17:19

編集2017/08/08 17:47

Qiita の「C言語のreturn 0の有用性が今更わかった話」という記事を読んで疑問に思ったので質問させてください。 C または C++ のmain()関数の戻り値 return 0 の実用的な使い方とは何でしょうか? また、それをどう実装するのでしょうか?

気付いたのですが、リンク先の例では、return 0 (異常なし)の場合に「OK」と出力され、逆に、return 1(異常あり)の場合に無言であります。これは「UNIXという考え方 The UNIX philosophy」に引用してある5つ目の定理「5.Silence is golden. 沈黙は金 」に反してしまいます。

$ ./a.out && echo "OK"

は、使い方の1つであり他にも使い方はたくさんあると考え、あれこれ思索してみた用法は、0 以外が戻ってきたら…

  • ログを書く。
  • 非常用の代替サービス等が起動する。
  • 管理者にメールが送信される。

などですが、実際にこれをどう実装するかは検討も着きません。 皆さんのアイデア、使用経験、それをどう実装した、または これに詳しい書籍があれば紹介していただけますか?

keicha_hrs, LouiS0616👍を押しています

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

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

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

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

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

guest

回答6

0

気付いたのですが、リンク先の例では、return 0 (異常なし)の場合に「OK」と出力され、逆に、return 1(異常あり)の場合に無言であります。

リンク先は一部のことしか書かれていないので、あまり参考にならないかもしれません。&&は左側のコマンドが成功したら右側のコマンドを実行するというものですが、当然のことながらその逆もあります。||でコマンドをつなげると、左側のコマンドが失敗(終了ステータスが0以外)したら右側のコマンドを実行します。
つまり、

$ ./a.out || echo "NG"

こうすれば、a.outが失敗したらNGと表示されます。

バッチ処理や自動化においては、単にコマンドを順番に実行するだけでなくコマンドの実行結果に応じて処理を変えたいこともあります。そのため、シェルには条件分岐やループ制御などの複雑な処理を行うための命令が多数用意されています。コマンドの終了ステータスはそういうときになくてはならないものです。

どういうことができるのか(どうやって書くのか)、お使いのシェルがbashならこのmanページが役に立つかもしれません。全機能の説明が書かれていて長いのですが、そのページの「リスト」と「複合コマンド」がご質問に該当する部分です。

投稿2017/08/09 00:25

catsforepaw

総合スコア5938

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

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

tf2014

2017/08/09 16:03

ご回答ありがとうございます。なるほど「一部のこと」ですよね。&& でなく、「||」を使えばエラーがあったときにメッセージがあり「5.Silence is golden. 沈黙は金 」と反しませんね。逆に成功したかったら「&&」を使えばよいということですね。
guest

0

C や C++ といった言語に関係なく戻り値 0 が正、0 以外の値がエラー扱いというのが一般的な使われ方です。一部 Plan9 の様に数値の終了ステータスを持たない物もあります。

0 と 0 以外の値を返せるのですが実はそれくらいしか取り決めが無く、人によって引数異常系は -1 にしたり 2 にしたりする人もいます。また物によってはビットマスクで終了時の状態を表すという方法も使われます。fsck コマンドが1例です。

0 - No errors 1 - File system errors corrected 2 - System should be rebooted 4 - File system errors left uncorrected 8 - Operational error 16 - Usage or syntax error 32 - Fsck canceled by user request 128 - Shared library error

fsck の終了ステータスは値を見ればそれがどういう状態で終了したのかがだいたい分かる様になっています。他の方が書いていますがシェルスクリプトでは set -e を書いておくと子プロセスの終了ステータスを判定して 0 以外であれば処理を継続しない様になっています。また bash では $? で直前に起動したプロセスの終了ステータスを得る事が出来ます。Windows のコマンドプロンプトの場合は %ERRORLEVEL% で判定出来ます。

プログラミング言語を使ってシステムを作る場合、終了ステータスは「自プロセスを起動した親プロセスに『これ以上処理を継続しないでくれ』と通知する為の手段」ですので、これはおまじないでも魔法でもなんでもなく、当たり前に考慮しないといけない話になります。

なお exit(0) でも同様の働きをしますが、C++ の場合は main 関数のスコープに定義されたオブジェクトのデストラクタが実行された後に値が返ります。かたや exit(0) はメモリの解放など無く突然終了します。(atexit という関数で exit 時に呼び出す関数を事前に登録する事も出来ます)

投稿2017/08/09 04:42

編集2017/08/09 08:06
mattn

総合スコア5030

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

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

guest

0

シンプルかつ強力な使い方として、set -eがあります。シェルスクリプト内でset -eとしておくと、終了コードが0以外のコマンドが来た場合に、そこでシェルスクリプト自体を終了するようになります。

投稿2017/08/08 22:19

maisumakun

総合スコア145186

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

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

tf2014

2017/08/09 15:58 編集

ご回答ありがとうございます。これ、使えそうです。A.Ichiさん、Chironiaさんの用法に set -e が使われるのだろうなと想像しています。
guest

0

こんにちは。

mainからのreturnで返却する値は、プロセスの終了ステータスになります。これは親プロセスが受け取ることができます。

子プロセスがエラー終了したのか正常終了したのか、知りたいことは良くあると思います。サブルーチンを呼び出して、それがエラー終了するようなものなら、やはりエラー知りたいですよね? それと同じことです。
私自身はエラーが戻ったらメッセージを表示して終了し、インストールミスがないか確認して貰うような使い方くらいしかしてないです。

巨大なシェルスクリプトを作る人たちは、もしかすると積極的に使っているかも知れません。

投稿2017/08/08 18:01

Chironian

総合スコア23272

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

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

tf2014

2017/08/09 15:52

ご回答ありがとうございます。シェルスクリプトでいろんな可能性がありそうですね。シェルスクリプトをもっと勉強したくなりました。
guest

0

「コマンドの戻り値をどう使うの?」という質問でしょうか?
例えば、Bashのif構文は、

Bash

1if コマンド 2then コマンドの戻り値が0のときに実行する処理 3else コマンドの戻り値が0でないときに実行する処理 4fi

ですので、「指定文字列がファイルにあれば戻り値0で、無い場合は戻り値1」というgrepコマンドを使って、

Bash

1if grep FOO bar.txt >/dev/null 2then echo FOO が bar.txt の中にあった 3else echo FOO が見つからなかった 4fi

のように出来ます。

外部コマンドでなく、Bashの内部コマンドですが、readは、「入力がEOFでなければ戻り値0で、入力がEOFなら戻り値1」というコマンドで、while構文は、「whileの後のコマンドが戻り値0の間、ループを実行して、戻り値が0でなければループ終了」なので、

Bash

1while read line 2do echo $line 3done < textfile

で、ファイル内容を表示出来ます。

他にも、直近のコマンドの戻り値は$?で参照出来るので、戻り値が1の場合と2の場合で処理を分けたりも出来ます。
例えば、上に書いたgrepでは、文字列が見つからなかったときに戻り値1で、指定したファイルが存在しなかった場合には戻り値2です。

Bash

1grep -q -s FOO bar.txt 2case $? 30) echo bar.txt に FOO があった 4 ;; 51) echo bar.txt に FOO が無かった 6 ;; 72) echo そもそもbar.txtが読めなかった 8 ;; 9esac

投稿2017/08/08 23:49

otn

総合スコア84618

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

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

otn

2017/08/08 23:52

上記は、シェルからコマンドを実行した場合ですが、プログラムからコマンド(他のプログラム)を子プロセスとして実行したときは、そのコマンド(子プロセス)の戻り値を知る事が出来るので、その値で処理を変えたり出来ます。
tf2014

2017/08/09 15:59

ご回答ありがとうございます。具体的なコードが書いてあるのでとても有用です。色々実験してみます。
guest

0

ベストアンサー

皆さんのアイデア、使用経験、それをどう実装した

cプログラムはバッチ処理に多用している関係で、クーロン起動、画面起動等の自動運転処理中でリターンコードは使っています。、コードには意味を持たせ(0,1,3...)、ご提示された項目への振り分けを行っています。

ログを書く。(異常時の際のデータベース、ネットワーク、データ不整合のログを出力)
非常用の代替サービス等が起動する。(リトライ実行、スキップ、中断、初期戻し)
管理者にメールが送信される。(夜中や休日に送られて来ます、即時対応、次回対応)

これらを行う判断としてリターンコードに意味を持たせ、データベースやネットワークに異常、業務的不整合が発生した場合、処理を中断、継続等させる判断をしております。
特にログは非常に重量となります。発生時点のこれが無いとリカバリー方法や判断が難しいです。

まれですがプログラムで判定をさせて、リターンコードで以降の処理の流れをコントロールする場合に使ったりしています。

投稿2017/08/08 23:29

A.Ichi

総合スコア4070

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

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

tf2014

2017/08/09 15:56

実例の紹介していただいてありがとうございます。これからreturn 0をどう使えばいいのかとても参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問