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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

2回答

1186閲覧

bashはどのようにしてcore dumpedと表示するかしないかを判断しているのでしょうか

ap2c9w

総合スコア40

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

1クリップ

投稿2020/09/04 14:13

bashにおいて、コマンドの実行中にCtrl + バックスラッシュを押すと、core dumpが生成される場合は

^\Quit (core dumped)

と表示され、core dumpが生成されないように設定している(例えばulimit -c 0を実行した)場合は、

^\Quit

と表示されます。

bashはどのようにして、core dumpedと表示するかしないかを判断しているのでしょうか。

core dumpのファイルが生成されたかを調べているのかと思ったのですが、なんらかの理由でファイルが生成できなかった場合でも^\Quit (core dumped)と表示されることを確認しました。
※Ubuntuにおいて、core dumpの生成がエラーになった場合、/var/log/apport.logに生成エラーのログが記録されていること、生成エラー場合でも^\Quit (core dumped)と表示されることを確認しました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

それ、bash自身の仕事ではないですよ。

単純にプロセス(コマンド)終了をbashが扱う時にOSがそういう情報を含めて情報をbashに返してくれてるだけです。
OSのAPIとしては wait, waitpid 等が該当するのですが、以下の Linuxのwaitpid(2)のmanページ に、OSが返してくれたstatus情報からどんな情報が得られるかが載っています。( 終了ステータスとか、終了原因となったシグナルとか )

なお、このmanページではWCOREDUMP(status)というC言語上のマクロで判断できることになっているのですが、bashでは生のステータス値から同等の判断をしているようですね。

該当箇所は次の通りで、WIFCOREDというマクロが、その「同等の判断」を行うものです。
※誰かの作ったbashソースのリポジトリのコピーより
https://github.com/bminor/bash/blob/master/jobs.c#L1789

jobs.c

1 if ((WIFSTOPPED (show->status) == 0) && 2 (WIFCONTINUED (show->status) == 0) && 3 WIFCORED (show->status)) 4 fprintf (stream, _("(core dumped) "));

WIFCORED自体は、単純にステータス値の128(0200)の位のbitを見ているだけのようですね。
※ 同じリポジトリの https://github.com/bminor/bash/blob/master/include/posixwait.h 参照のこと。OSによって違う可能性はあります

投稿2020/09/05 06:29

編集2020/09/05 06:33
angel_p_57

総合スコア1672

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

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

ap2c9w

2020/09/05 07:35

非常に的確な回答ありがとうございます。 Linuxのwaitpid(2)のmanページを調べないと見て、WIFSIGNALEDおよびWCOREDUMPのマクロを使用すればcore dumpしようとしたかを取得できることが分かりました。 頂いた情報で実装を検討いたします。
guest

0

core dumpのファイルが生成されたかを調べているのかと思ったのですが

単純にcore dumpファイルを生成しようとしたかどうかじゃないでしょうか。
なんらかの理由でファイルが生成できなかった場合でも生成しようとしたので表示する。

ulimit -c 0の場合は core dumpファイルを生成しない設定なのでcore dumpedを表示しない。


追記
CTRL+\を押すとシグナルSIGQUITを送信します(この時core dumpedを表示)。このキーCTRL+\はsttyコマンドで変更することが出来ます。
このSIGQUITは簡単に説明すると「core dump出力しプロセス終了せよ」というシグナルです。このシグナルを受けたプロセスはcore dumpを出力しプロセスを終了します。

シグナルに関しては以下など参照ください。

(qiita.com)bashとCtrlキーで送るシグナル
(www.atmarkit.co.jp)Linuxのシグナルとは何か?
(ja.wikipedia.org)シグナル (Unix)

投稿2020/09/04 15:06

編集2020/09/05 00:14
Y.H.

総合スコア7914

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

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

ap2c9w

2020/09/04 23:27

ご回答ありがとうございます。 ご回答から「ファイルを生成しようとした」ことを検知できる仕組みがあると理解しました。 その仕組みをご教示頂きたいです。
Y.H.

2020/09/04 23:56

厳密には 「ファイルを生成しようとした」ことを検知 しているわけではありません。 シグナル「SIGQUIT」(core dump出力しプロセス終了せよ)をプロセスに送信しただけです。 回答にシグナルについて追記しましたので参照ください。
ap2c9w

2020/09/05 01:39

回答ありがとうございます。 すみません、自分が知りたいことをご教示頂くには、自分が今したいことを詳細に説明させて頂く必要がございました。 まず、自分がC言語で作成しているプログラムについて説明させていただきます。 forkしたプロセスにおいて、CTRL+\が押された際に、SIGQUITを送信するプログラムを作りました。 自分が作成したプログラムにおいて、例えばcatをforkしEOL待ちの状態で、CTRL+\を押すと、「core dumped」と表示されずにcatは終了します。 以上から、catがSIGQUITを受信した際に、catが「core dumped」と出力して、終了するわけではないと想定しました。 とすると、bashのようにCtrl+\が押された場合に「core dumped」と表示するには、自分が作っているプログラムで「core dumped」と表示する必要がある…と想定しました。 bashのように、core dumpファイルを「生成しようとした際」だけ、「core dumped」と表示するにはどうしたらよいのか…を知りたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問