PR

【Linux C】fork、exit、setsidのセットはデーモン化処理である

組み込み機器

今までこんな関数扱ったことない…

linuxでのC言語案件で触ったファイルに知らない固有関数がたくさん…忘備録としてまとめた記事になります。

姫野秀徳

組み込みエンジニアとしてメーカー勤務10年。
第二種電工事士、基本情報技術者、Code.org認定教師。
microbitを用いた電子工作&プログラミング教室を開校。
組み込み開発の実際を発信するyoutube活動も行う。

無料で学べる組み込み開発オンラインスクールはじめました!
https://kumicla.tatepro.com

姫野秀徳をフォローする

ソースコードの流れ

main関数の先頭で

fork ⇒ exit() ⇒ setsid()

が実行されていました、なんだこれは…。

結論から言うと、これは処理をバックグラウンドで回すためのデーモン化を行っています。

fork()

プロセスを分割(=fork直下のコードのコピーが生成)します。

分割前を親、分割後を子と表現し、マルチタスクとして動作。

親と子はforkを呼んだ時の戻り値(プロセスID)で判断でき、0の場合は子、0より大きい場合は親、0未満の場合はエラーとなります。

なので、コードはこんな感じ。

int id = fork();

if(id == 0){
  //do something child
} else if(id > 0){
  //do something parent
  exit(0); //後述
} else {
  //error
}

このid変数をif文で分けて処理を別個に設けることが可能。

exit(0)

プロセスを終了する。引数が0の場合正常終了、0以外だったら異常終了を意味している。

fork()項で述べたように、プロセスIDで親子を判断でき、親プロセスでexit()させることが多い。

つまり、forkして親をexitした時点で子プロセスしか残ってない。

この時点では何のためにやってるのかさっぱり分からない…。

setsid()

プロセスが親プロセスでない場合、新たなセッションを作成する。

これは子プロセスが独立した処理になるということを意味している。

ところで、セッションとは何だろうか。

プログラムの構造を理解する

プロセスとはプログラムの実行単位を言う。

そして、forkで分けたプロセスは元になっているのを親、コピーしてできた方を子と言った。

exitで親プロセスを終了して、子プロセスだけ残っている。

で、こうしたプロセスは全てセッションという大枠の中で行われている。

セッション自体は、ユーザーがターミナルからログインし、シェルを実行するときに形成される。

セッションがユーザーが実行するすべてのプロセスをグループ化し、リソース管理やターミナル制御を行っている。

setsidは、このセッション内にいる子プロセスを独立した新たなセッションとして作ることを行っている。

新たなセッションのプロセスはバッググラウンドで処理が実行され、これをデーモンプロセスという。

つまり、fork、(親の)exit、setsidのセットはデーモン化ということになる。

デーモン化の利点

デーモンプロセスがセッションリーダーとして新しいセッションを作成することによって、以下の利点がある。

  1. ターミナルからの切断: セッションリーダーとなったデーモンプロセスは、親セッション(ターミナルなど)から切り離されるため、ターミナルの状態の変更や制御信号がデーモンに影響を与えることがありません。
  2. ファイルディスクリプタの独立性: セッションリーダーによって作成されたセッション内では、ファイルディスクリプタが新しい制御端末に関連付けられないため、デーモンプロセスがファイルディスクリプタを開いたり閉じたりするときに予期せぬ動作が発生しなくなります。
  3. プロセスグループとセッションIDの独立性: セッションリーダーによって新しいセッションが作成されるため、プロセスグループIDとセッションIDが切り離され、デーモンプロセスが他のプロセスやセッションと独立して識別されることが可能になります。

デーモンプロセスが実行される環境では、通常fork()を使用して新しいプロセスを生成し、setsid()を呼び出して新しいセッションを作成します。このようにしてデーモンプロセスはセッションリーダーとなり、上記の特性を持つバックグラウンドプロセスとなります。

まとめ

fork、(親の)exit、setsidのセットはデーモン化ということ

この内容が良いと思ったら、いいね💖を押して教えてください!

組みクラ – 組み込み開発を学び、未来を創るエンジニアへ
無料で学べる!組み込み開発の基礎から応用までをマスターできるオンラインスクール「組みクラ」

組み込みエンジニアは、あらゆる産業の基盤を支える重要な職業です。
私たちタテプロは、次世代の組み込みエンジニアを育成し、業界の競争力を高めるために活動しています。
あなたも、無料で学べる「組みクラ」で、組み込み開発のスキルをしっかり身につけ、キャリアを加速させましょう!
今すぐ学び始めて、将来の自分をステップアップさせる第一歩を踏み出しませんか?

\立プロとLINEで友だちになりませんか/
立プロと友だちになる
組み込み機器
シェアしていただけると嬉しいです!

コメント

タイトルとURLをコピーしました