C LANGUAGE TECHNOLOGY

【C言語】プロセスの生成と実行【fork/wait/execve/getpid/getppid関数】

悩んでいる人

C言語でプロセスの生成と実行方法を教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

プロセス

プロセスとは,OSが管理するプログラムのインスタンスのことです.

プロセス間ではメモリ空間を共有しませんが,同じプロセス内のスレッド間ではメモリ空間を共有します.

スレッドと比較して,プロセスはメモリ保護できるメリットはありますが,プロセス通信のオーバーヘッドは大きくなります.

スレッドの生成と実行を知りたいあなたはこちらからどうぞ.

C言語 スレッド
【C言語】スレッドの生成と実行【pthread,マルチスレッド,スレッドIDの取得】

こういった悩みにお答えします. こういった私から学べます. 目次1 スレッド2 pthreadによるマルチスレッドプログラミング3 pthreadでスレッドIDの取得3.1 pthread_self関 ...

続きを見る

fork関数でプロセスの生成,wait関数で子プロセスの終了まで待機

fork関数は,子プロセスを生成する関数です.

fork関数を呼び出すと,呼び出し元がプロセスを複製して新しいプロセスを生成します.

新しいプロセスは子プロセスと呼ばれ,呼び出し元のプロセスは親プロセスと呼ばれます.

fork関数の戻り値は子プロセスの場合は0,親プロセスには子プロセスのプロセスID(PID)になります.

なので,fork関数の戻り値で条件分岐すれば親プロセスと子プロセスで別々の処理ができます.

PIDは0以上の値になり,戻り値が負の値の場合はエラーになります.

※PIDが0のプロセスはswapper(またはsched)プロセス,PIDが0のプロセスはinitプロセスと呼ばれます.

wait関数は,プロセスの状態変化を待つ関数です.

子プロセスのいずれかが終了するまで,呼び出し元のスレッドの実行を一時停止します.

wstatusがNULLでなければ,statusで指すint型のアドレスに状態情報を格納します.

戻り値は終了した子プロセスのプロセスIDになります.

fork関数でプロセスを生成し,wait関数で子プロセスの終了まで待機するコードは以下になります.

実行結果は以下になります.

execve関数でコマンドの実行

execve関数は,引数pathnameで指定されたプログラムを実行する関数です.

呼び出したプロセスが現在実行しているプログラムは,新たに初期化されたスタック,ヒープ,(初期化された,または初期化されていない)データセグメントを持つ新しいプログラムに置き換えられます.

argvは新しいプログラムのコマンドライン引数として渡される文字列へのポインタの配列です.

これらの文字列の最初のもの(すなわち argv[0])には,実行されるファイルに関連するファイル名が格納されます.

envpは,新しいプログラムの環境として渡される文字列へのポインタの配列で,通常は key=value の形式をしています.

execve関数の戻り値は成功すると返らない(戻り値がない)ことに注意して下さい.エラーの場合のみ返ります.

execve関数でコマンドを実行するコードは以下になります.

execve関数は初見では結構使いづらいので注意して下さい.

実行結果は以下になります.

execve関数にはパス検索機能はないので,/bin以下にあるechoコマンド等は絶対パスを指定しないと動作しないことに注意して下さい.

getpid/getppid関数でPIDを取得

getpid/getppid関数は,PIDを取得する関数です.

getpid関数は呼び出し元のプロセスのPID,getppid関数は呼び出し元のプロセスの親プロセスのPIDを返します.

getpid/getppid関数を利用するコードは以下になります.

実行結果は以下になります.

3行目と6行目のPID,4行目と7行目のPIDが同じ値になることがわかります.

まとめ

C言語でプロセスの生成と実行方法を紹介しました.

具体的には,fork/wait/execve/getpid/getppid関数の使い方を解説しました.

プロセスを生成するとマルチプロセスになりコードの書き方が難しくなりますので,基本的な使い方を習得しておきましょう.

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

友だち追加

独学が難しいあなたは,C言語を学べるおすすめのオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , , , , , , , , ,