LoT ラブオンテック

非モテ男の、非モテ男による、【女の子にモテたい】非モテ男のためIT活用ブログ

プログラミング

Cでデーモンの実装してみた!デーモン周りのまとめ!

更新日:



今回はデーモンを実装します。

デーモンは英語でdaemonです。

守護神の意味があるそうで、

悪い方はdemonと書きます。



デーモンは、プロセスの一種で、

常にバックグラウンドで動作し続けます。



一般的なプロセスは命令を遂行したら、

終了しますが、デーモンは

終わりがないのでメモリ上に常駐します。



では無限ループさせるプロセスは、

デーモンと言えるでしょうか。



答えはNoです。



デーモンプロセスになるには、

ある条件があります。



それを理解するには、

いくつかの予備知識が必要です。



全ての予備知識を扱うと、

膨大な量になってしまうので、

この記事中では、読み進めるのに

支障が出ない程度に簡単に説明していきます。




記事最後に、Cでデーモンを実装した

コードについてのご紹介があります。



init / tty / セッション / プロセスグループ / プロセス の関係性



これらはプロセス間の関係を示します。

デーモンはプロセスの一種であると

冒頭でお話しました。



したがってまずプロセスについて

もう一度再確認しておきましょう。

ここで私なりのイメージ図を

以下に示します。




間違っていたら

ご指摘いただけると幸いです。



まず、そもそもプロセスとは何でしょうか。

プロセス
とは現在実行中のプログラムです。

プロセス1つ1つに固有のIDが割り振られます。

このIDをPIDと言います。



プログラムの実行にはハード資源などが

必要になり、OSによって割り当てられます。



各プロセスは、この資源を他のプロセスと

共有せずに、基本的に使用中は独占します。



そんなある種のプロセスの集まりを

プロセスグループ
と言います。

そのプロセスグループの頭を

プロセスグループリーダと呼びます。



ちなみにプロセスグループリーダの

PIDをそのグループIDとして使用します。



プロセスグループの役割は、

例えば、シグナルの共有などです。



シグナルは基本的に1プロセスに

送信されますが、リーダに送った際は、

そのリーダが管轄する他のプロセスにも

シグナルが送信されます。



そしてプロセスグループの集まりを

セッションと言います。



そして、いくつかのセッションで

1つの制御端末を共有します。

それが tty (teletypewriter)です。



あるプロセスから見たときに、

そのプロセスの親プロセスのあたる

シュル(bash)のことを言います。



セッションやプロセスグループは

ただのまとめ役だったのに対し、

ttyはプロセスの親子関係になります。



シュルは奥深いので、

詳しい説明は省きますが、

我々が普段よく使うCUIです。



このシェルも実はプログラムであり、

プロセスの仲間に該当します。



psコマンドで実行中のプロセスを見ると、

そこにしっかりとbashの文字があります。

bashは、Linuxにおける

CUI版シェルの呼び名です。



もっと言うと、このpsコマンドも

プログラムなのでプロセスIDを持ちます。



最後に、全ての制御端末は

initプロセスを親プロセスに持ちます。



initプロセスはブート時に、

OS(kernel)によって立ち上げあげられる

最初のプロセスです。



このinitプロセス自身も

デーモンとして動いています。



言い換えると制御端末(shell)も

initプロセスによって実行された

子プロセスといえるでしょう。


デーモンになるには


デーモンはプロセスではあるものの、

デーモンと呼ばれるには条件があります。



デーモンの詳しい定義は・・・



ttyを持っておらず

プロセスグループリーダではあるが、

セッションリーダではない。



そして動作するディレクトリが

ルートディレクトリであり、

デーモンが保有するすべての

ファイルディスクリプタを閉じている。



これら満たすプロセスのことを言います。



デーモンは制御端末(tty)と

関係を切り離す必要があります。



ttyと切り離したら、親プロセスを失うので、

全ての親であるinitプロセスの直下に

配属することになります。



この切り離す作業には、

シグナルを使います。

シグナルはプロセス間通信に使われる

メッセージのある信号です。



数あるシグナルの中から、

シグナル1番: SIGHUPを使います。

このシグナルをデーモンプログラムを

実行した端末(親プロセス)に飛ばします。



ここで本来であれば、



ここで注意したいのは、

端末と切り離されたプロセス(デーモン)は、

端末とのインタラクティブな操作が

出来なくなってしまいます。

(例えば、printfによる標準出力)



よってデーモンの操作には、

シグナルを飛ばして行う必要があります。

確認ですがシグナルは

プロセス間通信に用いられる信号です。



ttyと切り離したらデーモンが管轄する

セッションを作成して、さらに

プロセスグループリーダを設定します。



プロセス間関係の体裁を

上記で説明したように整える必要があります。





ここで実際にデーモンを作成した

cソースを見てみましょう。


最後まで読んでいただきありがとうございました。


-プログラミング

Copyright© LoT ラブオンテック , 2020 All Rights Reserved Powered by STINGER.