今回はデーモンを実装します。デーモンは英語でdaemonです。悪い方はdemonと書きます。常にバックグラウンドで動作し続けます。終了しますが、デーモンは終わりがないのでメモリ上に常駐します。無限ループさせるプロセスは、デーモンと言えるでしょうか。デーモンプロセスになるには、ある条件があります。それを理解するには、いくつかの予備知識が必要です。膨大な量になってしまうので、この記事中では、読み進めるのに支障が出ない程度に簡単に説明していきます。記事最後に、Cでデーモンを実装したコードについてのご紹介があります。関係性これらはプロセス間の関係を示します。デーモンはプロセスの一種であると冒頭でお話しました。したがってまずプロセスについてもう一度再確認しておきましょう。ここで私なりのイメージ図を以下に示します。間違っていたらご指摘いただけると幸いです。そもそもプロセスとは何でしょうか。プロセスとは現在実行中のプログラムです。プロセス1つ1つに固有のIDが割り振られます。このIDをPIDと言います。プログラムの実行にはハード資源などが必要になり、OSによって割り当てられます。各プロセスは、この資源を他のプロセスと共有せずに、基本的に使用中は独占します。そんなある種のプロセスの集まりをプロセスグループと言います。そのプロセスグループの頭をプロセスグループリーダと呼びます。ちなみにプロセスグループリーダのPIDをそのグループIDとして使用します。シグナルの共有などです。シグナルは基本的に1プロセスに送信されますが、リーダに送った際は、そのリーダが管轄する他のプロセスにもシグナルが送信されます。プロセスグループの集まりをセッションと言います。いくつかのセッションで1つの制御端末を共有します。(teletypewriter)です。あるプロセスから見たときに、そのプロセスの親プロセスのあたるシュル(bash)のことを言います。セッションやプロセスグループはただのまとめ役だったのに対し、ttyはプロセスの親子関係になります。我々が普段よく使うCUIです。このシェルも実はプログラムであり、プロセスの仲間に該当します。psコマンドで実行中のプロセスを見ると、そこにしっかりとbashの文字があります。bashは、LinuxにおけるCUI版シェルの呼び名です。言うと、このpsコマンドもプログラムなのでプロセスIDを持ちます。最後に、全ての制御端末はinitプロセスを親プロセスに持ちます。initプロセスはブート時に、OS(kernel)によって立ち上げあげられる最初のプロセスです。このinitプロセス自身もデーモンとして動いています。言い換えると制御端末(shell)もinitプロセスによって実行された子プロセスといえるでしょう。デーモンになるにはデーモンはプロセスではあるものの、デーモンと呼ばれるには条件があります。デーモンの詳しい定義は・・・ttyを持っておらずプロセスグループリーダではあるが、セッションリーダではない。動作するディレクトリがルートディレクトリであり、デーモンが保有するすべてのファイルディスクリプタを閉じている。これら満たすプロセスのことを言います。デーモンは制御端末(tty)と関係を切り離す必要があります。全ての親であるinitプロセスの直下に配属することになります。この切り離す作業には、シグナルを使います。シグナルはプロセス間通信に使われるメッセージのある信号です。SIGHUPを使います。このシグナルをデーモンプログラムを実行した端末(親プロセス)に飛ばします。端末とのインタラクティブな操作が出来なくなってしまいます。(例えば、printfによる標準出力)よってデーモンの操作には、シグナルを飛ばして行う必要があります。確認ですがシグナルはプロセス間通信に用いられる信号です。ttyと切り離したらデーモンが管轄するセッションを作成して、さらにプロセスグループリーダを設定します。プロセス間関係の体裁を上記で説明したように整える必要があります。ここで実際にデーモンを作成したcソースを見てみましょう。最後まで読んでいただきありがとうございました。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。date*日本語が含まれない投稿は無視されますのでご注意ください。MACアドレスを取得してみました。いくつ作成できるか検証してみます。実際に確認してみましょう。このようになってしまいます。...recvで受信しEthernetヘッダを表示してみたデータリンク層を扱えるソケットを使って、受信したデータのEthernetヘッダを表示してみました。自分でEhternetフレームを定義する必要はなく、すでにライブラリに準備されています。調べたのでその備忘録です。Rawソケットを使う必要ありません。そっちの方が簡単です。...PREVCで見るシグナルハンドラとkillコマンドについて(非同期シグナルセーフ関数も)NEXT微生物燃料電池の種類と原理についてのまとめプロフィール某名門大の大学院生です。IoT、人口知能、ネットワークインフラ系まで幅広く興味があります。いう方のために簡単にまとめてみました。IPv6を取得して標準出力させてみます。自分の目で調査したのでまとめます。変更までする方法をご紹介します。ioctlシステムコールを使います。フラグを引数に指定します。一度まとめておこうと思います。以下が思いつくかと思います。全て"stdio.h"に定義されています。