II-8-8. デバイスファイルの扱い方

キーボード、ディスプレイ、プリンタ、ディスクといった全てのデバイスをファイルとして一元的に取り扱う考え方を説明する。また、入出力先を変更するリダイレクトについて述べ、デバイスファイルを簡単に利用する方法を紹介する。

【学習の要点】

* 各種ハードウェアデバイスは、カーネル内のデバイスドライバによって操作される。ユーザは、スペシャルファイル(デバイスファイル)を通してカーネル内のデバイスドライバの機能にアクセスできる。

* スペシャルファイルは、カーネルによって特別に扱われる一方、ユーザからは通常のファイルのように見える。このためプログラムからは、open, read, writeなどのシステムコールを用いて記述子を取得し、アクセスすることができる。

* ある記述子に関連づけられたストリームを、別の記述子に関連づけることを入出力リダイレクションと呼ぶ。通常標準出力に出力されるストリームをファイルに出力するには、端末デバイスの記述子1を閉じ、続いて目的のファイルを開いて新たに記述子1を獲得することで行われる。

図II-8-8. dup2によるリダイレクト

 

【解説】

1) デバイスファイルの扱い方

* Linuxカーネルは、ハードウェアデバイスに対するデバイスドライバを実装する。

* デバイスファイルは、ユーザプロセスが、カーネル内のデバイスドライバにアクセスすることができるようにカーネルが提供するインタフェースである。これはスペシャルファイルとも呼ばれる。ファイルシステム上に名前を持ち、ユーザプロセスは通常のファイルと同じread, writeなどのシステムコールを用いてアクセスできる。

* デバイスドライバ側は、ユーザプロセスからのシステムコールを受けて、それらに対応するオペレーション関数を実装している。この中には、通常のファイルに対しては使用しないような、ioctl, pollシステムコールに対応するオペレーション関数も含まれる。

2) デバイスファイルを使ったプログラミング例

* Linuxには、/dev/rtcというハードウェアクロックを制御するためのキャラクタデバイスファイルが存在する。このデバイスファイルを使ったプログラミングの例を示す(エラー処理は省略してある)。

* /dev/rtcは、デバイスファイルなのでopenシステムコールでオープンすることができる。ファイル記述子を得る。

int rtcfd;

rtcfd = open("/dev/rtc", O_RDONLY);

* ioctlシステムコールは、主にデバイスを設定するのに使用される。この例では、ioctlで割り込み周期(tick)を8192に設定する。

ioctl(rtcfd, RTC_IRQP_SET, 8192);

* ioctlで制御できる項目と引数の型は、デバイスドライバ毎に異なる。通常デバイスドライバのヘッダファイル(この例では、/usr/include/linux/rtc.h)で知ることができる。

* readシステムコールで、デバイスファイルの内容を読む。この例では割り込みを待つ(読み込み可能になるまでブロックされる)。値を読み込むことができるとreadが返る。

unsigned int data;

read(rtcfd, &data, sizeof(data));

* デバイスファイルの使用を終えたら、closeシステムコールでクローズする。

close(rtcfd);

3) デバイスファイルの入出力リダイレクト

* シェルのリダイレクトを利用して、デバイスファイルに対して通常のファイルのように、入出力先を変更することができる。例えば以下の例は、シリアル端末 (/dev/ttyS0) からの情報をターミナルエミューレータの画面で表示する入力リダイレクトの例である。

cat < /dev/ttyS0

OSS Course Naviのコンテンツは IPA OSS モデルカリキュラムを基としています。

フォーラム会員企業専用

記事配信

コンテンツ配信

ユーザログイン