投稿

10月, 2019の投稿を表示しています

Linuxシステムコール、プロセスの生成

イメージ
UNIX / Linux システムコール・プログラミング プロセスの生成 Linuxのプロセスとは? Linuxでは、プログラムの実行単位がプロセスとして定義されています。 これまで、このシリーズでもプロセス間通信を取り上げてきましたが、そもそもプロセスとは何でしょうか? 今回は、このプロセスについて取り上げてみたいと思います。 さて、先程プログラムの実行単位がプロセスだと書きました。通常、我々はgccなどを使って作成された ”実行ファイル” をメモリに読み込んでプログラムを実行します。これがプロセスです。 簡単な”Hello World”を例題に説明します。 hello.c #include <stdio.h> int main(int argc, char** argv) { printf("Hello World\n"); } このプログラムをコンパイルします。     $ gcc hello.c -o hello とすると、実行ファイル hello が出来上がります。 実行するには、     $ ./hello とすれば、実行されます。 当然ですが、このときにナニが起きているのか? 今まで気にしたことは無いかもしれませんが、詳しく見てみましょう。 ”$ ./hello”では、実行ファイルをコマンドとして、シェルから実行しています。 このシェルというユーザーインターフェイスも1つのプロセスとしてメモリ空間に存在しています。 ユーザーが、”$ ./hello”と、入力するとシェルは、fork() というシステムコールを呼び出して別のプロセスのためのユーザー空間を生成します。 そして、exec()というシステムコールを使ってそのメモリ空間に実行ファイル”hello”を読み出して展開し、main()にジャンプすることで、実行ファイル”hello”が実行され、コンソールに"Hello World"が表示されます。 UNIX系のOSでは伝統的に fork()/exec() という2段階のシステムコールによってプロセスの生成を行います。 まず、fork()ですが、このシステムコールは呼び出したプロセスのコピーを作り出します。 実際のコードを見て