C言語

【C言語】fork関数の使い方と注意すべきポイント

2021年9月26日

関数仕様

書式

引数

なし

戻り値

正の値 子プロセスのプロセスID(forkに成功し、親プロセスに返される)
0 forkに成功し、子プロセスとして動く
-1 エラーが発生

 

機能

  • 呼び出し元プロセスを複製して新しいプロセスを生成する
    ※新しいプロセスは「子」プロセスと呼ばれ、呼び出し元プロセスは「親」プロセスと呼ぶ
  • 新たなプログラムを実行するために fork を呼出す場合、execve と組み合わせて使用する

関連

 

注意すること

注意ポイント①

子プロセスは、親プロセスが持つファイルディスクリプターのコピーを引き継ぐ。

fork の機能で説明した通り、fork は呼出し元プロセスの複製を生成します。
fork を呼出す前に pipesocketpair などでプロセス間通信の準備を行う場合は便利な仕組みです。

しかし、fork を呼出すプロセスがTCP ソケットなどを使用している場合は注意が必要です。
TCP の下位プロトコルは OS 側で制御されます。
ソケットが閉じられたことを知らせる FIN は、ソケットが閉じられた時に送信されますが、
意図せず複製が生成された場合、FIN が送信されないことになり相手側で通信断を検知できなくなります。

参考

意図しないコピーの引継ぎを防ぐには、O_CLOEXEC を指定してオープンします。
【C言語】open関数の使い方」もご覧ください。

 

注意ポイント②

子プロセスを終了させる場合は、_exit() システムコールを使うこと。

子プロセスを終了する際には、main() 関数を return したり、標準Cライブラリの exit() を呼出すのではなく、
システムコールの _exit() を呼出す必要があります。

先ほどの「注意ポイント①」にも関連しますが、標準Cライブラリの exit() では、
親プロセスから引き継いだ入出力ライブラリ(stdio.h)のバッファをクリアする処理が動いてしまいます。

参考

exit 関数については、「【C言語】exit関数の正しい使い方」も参考にどうぞ。

 

サンプルプログラム

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-C言語
-, ,