ふつうのLinuxプログラミング

第4回 プロセスとファイルシステムをつなぐストリームの概念

青木峰郎
2008/12/4

第3回1 2次のページ

本連載では、Linuxで行うC言語プログラミングを初歩から解説します。ただし、C言語の基礎とLinuxでエディタが使えること、cd、ls、cat、lessといった基本的なコマンドを知っていることが前提になります。C言語の入門書を読み終えた人、WindowsでCやC++を使ってプログラミングをしていた人で、これからLinuxでのプログラミングを学びたい人、プログラミングを通じてLinuxの仕組みを理解したい人、LinuxやUNIXプログラミングに関するほかの書籍を読んだが難しくて挫折した人に向け、Linuxプログラミングの仕組みを解説します。

 前回の「ファイルシステムの種類と機能」では、「ファイルシステム」について解説しました。今回は、残り2つの重要概念「プロセス」「ストリーム」について説明します。

◆今回学ぶこと
・プロセス
・プロセスID
・シグナル
・ファイルにつながったストリーム
・デバイスにつながったストリーム
・パイプ
・ネットワーク通信
・プロセス間通信

本連載は、ソフトバンククリエイティブ刊行の書籍『ふつうのLinuxプログラミング』のうち第1部「Linuxの仕組み」の中から「第2章 Linuxカーネルの正解」と「第3章 Linuxを描き出す3つの概念」を、同社の許可を得て転載するものです。

本書は、LinuxにおけるC言語プログラミングの入門書です。「Linuxの世界が何でできているのか」に着目し、「ファイルシステム」「プロセス」「ストリーム」という3つの概念を紹介しています。

なお、本連載は転載を行っているため@IT自分戦略研究所の表記とは一部異なる点があります。ただし、Webで掲載するに当たり、(例えば「本書は」としている部分は「本連載は」としていること、図版などの省略など)、表現を若干変更している点がありますが、その点ご了承ください

プロセス

 「プロセス」とは、簡単に言えば、動作中のプログラムのことです。それに対して「プログラム」は、ファイルのような形態で存在しているデータのことも含む言葉です。例えば、本書『ふつうのLinuxプログラミング』第1章で作ったhelloはプログラムです。これを動かすと、動かすたびに新しいhelloプロセスができます。ここからわかるように、1つプログラムがあればプロセスはいくつでも作れます。

 試しにシェルで「ps ax」と実行してみてください。現在自分のコンピュータに存在するプロセスがすべて表示されます。例として、私が自分のコンピュータで「ps ax」を実行してみたときの出力を次に示します。

$ps ax
  PID TTY      STAT   TIME COMMAND
    1   ?        S      0:03 init [3]
    2   ?        S      0:00 [keventd]
    4   ?        S      0:00 [kswapd]
    6   ?        S      0:00 [kupdated]
   54   ?        Ss     0:00 /usr/sbin/syslogd -m0
   57   ?        Ss     0:00 /usr/sbin/klogd
   59   ?        S      0:00 /usr/sbin/crond -l10
   77   ?        Ss     0:00 /usr/sbin/rpc.portmap
   81   ?        S      0:00 /usr/sbin/ypbind
   82   ?        S      0:00 /usr/sbin/ypbind

                         :
                         :
  104   tty2     Ss+    0:00 /sbin/agetty 38400 tty2 linux
  105   tty3     Ss+    0:00 /sbin/agetty 38400 tty3 linux
  106   tty4     Ss+    0:00 /sbin/agetty 38400 tty4 linux
                         :

 いろいろなプロセスが動いていることがわかりますね。一番右の欄にはそのプロセスが起動されたときのプログラム名と、コマンドライン引数が表示されています。

 先ほども述べましたが、1つプログラムがあればプロセスはいくつでも作れます。それは上記のpsコマンドの出力に/usr/sbin/ypbindや/sbin/agettyがいくつも表示されていることからも確かめられます。

■プロセスID

 ところで、1つのプログラムからプロセスがたくさん作れるということは、プログラム名だけではプロセスを互いに区別できないということです。先ほどの例では、「agettyプロセス」と言うだけでは、該当するプロセスが3つになってしまいますね。

 そこで役立つのが、プロセスID(process ID)です。psコマンドの出力の一番左の欄に注目してください。この欄に表示されている番号が各プロセスのプロセスIDです。プロセスIDは、システム上の全プロセスに対して重複しないように振られている通し番号です。プロセスIDを使うと、ある特定のプロセスを一意に指定できます。

 「一意に」というのは、「他のものと紛れることがなく、必ずただ1つの対象を指定できる」ということです。また、同じ意味で「ユニークな」という言葉もよく使われます。

■シグナル

 プロセスIDはどんなときに使うのでしょうか。IDが役に立つ代表的な例として、シグナル(signal)があります。

 みなさんは、Ctrl+Cを押して実行中のコマンド(プロセス)を止めた経験があると思います。この仕組みを支えているのがシグナルです。Ctrl+Cを押すと、カーネルが該当プロセスに割り込みシグナル(SIGINT)を送り、それを受け取ったプロセスが自発的に終了します。もっとも、この辺りの仕組みは書籍『ふつうのLinuxプログラミング』第4章で説明する「端末」や、書籍『ふつうのLinuxプログラミング』第12章で説明する「プロセスグループ」が絡んでいるため、完全な説明は第13章まで待ってもらわなければなりません。

 シグナルはUNIXに古くからある仕組みで、UNIX(Linux)プログラミングでは非常に重要な位置を占めています。

ストリームとは?

第3回1 2次のページ

ふつうのLinuxプログラミング バックナンバー

自分戦略研究所、フォーラム化のお知らせ

@IT自分戦略研究所は2014年2月、@ITのフォーラムになりました。

現在ご覧いただいている記事は、既掲載記事をアーカイブ化したものです。新着記事は、 新しくなったトップページよりご覧ください。

これからも、@IT自分戦略研究所をよろしくお願いいたします。