ブログに関する役立つ知識をまとめています
UNIXプログラミング

【C言語】プロセス生成に関する関数(fork, exec, exit, wait)を使ってみよう!!

みなさんこんにちは!

今回は fork(), execファミリー, exit(), wait() などの、

UNIXプログラミングの重要なテーマである『プロセス生成に関するシステムコール』について解説していきたいと思います。

プロセス生成に関係するシステムコールの種類

プロセスを生成するために関係するシステムコールにはいくつか種類があるのですが、

それらの中でも特に重要なものは大きく分けで以下の4種類があります。

プロセスを複製するシステムコール
fork()など

プロセスの変身をするシステムコール
execute()、execel()など

プロセスを終了するためのシステムコール
exit()、_exit()など

子プロセスの終了の待機をするシステムコール
wait()など

これらをうまく使うことでプロセスを自由を操作することができるようになります。

というわけで、

これらのシステムコールの使い方をソースコードと合わせて見ていくことにしましょう。

プロセスの複製をするシステムコール

fork()

プロセスを複製するためにはfork()を使います。

fork()は実行中のプロセスを複製するシステムコールで、自身をコピーして子プロセスを作成します。

たとえばsystem()などの関数は内部でfork()を使っています

この関数の面白いところは、後ほど詳しく説明しますが、returnを二回することです。

用法は以下の通り。

<引数>
無し

<返り値>
親プロセスでは子プロセスのPIDを返し、子プロセスでは0を返す。エラーの際には−1を返す。

先ほど、

fork()は2度returnをするという説明をしましたが、これは一体どういうことなのでしょうか?

以下のソースコードを実行して挙動を見てみましょう。

このコードを実際にコンパイルして実行してみると、

というような出力になったと思います。

『どうしてprintf()が二回されているんだろう?しかも違う結果で・・・』

と思った方もいるかもしれませんが、これは最初のプロセスがfork()で子プロセスを生成しているからです。

fork()は子プロセスには返り値として0を返すことからも、fork()によってプロセスが複製されていることがわかりますよね。

プロセスの変身をするシステムコール

プロセスの変身をするシステムコールにはexec族というシステムコール族があります。

そもそも、

『どうしてプロセスを変身させるシステムコールなんてものがあるの?』という疑問が浮かび上がるかもしれませんが

これはプロセスに別のコマンドを実行させたいからです。

execファミリー

execファミリーはexecl、execv、execleなどの関数からなる関数族です。

まずはexecが何をする関数なのかを理解するために、execve()の利用法みてみましょう。

<内容>
引数の”filename”によって指定されたプログラムを実行する関数

1 2 3