ファイル操作
GNU/Linuxシステムでのファイル操作について.ここでは特にシステムコールを用いてファイル操作する方法について.
ls /devとか
ls /procなどとすると,たくさんのファイルがある.これらはデバイスやそれらの情報だったりする.だから(?)Linuxではデバイスをファイルとして扱えるらしい.つまりopen,close,read,write,ioctlができる.
そんなんだから,普通のファイルを扱えるようになることは,いろんなデバイスをいじるために不可欠なのだ.
ファイルアクセスに使用されるシステムコールは,write,open,read,close,ioctlが主である.
writeはファイルディスクリプタに書き込んでくれる.
一つのプロセスが開けるファイルディスクリプタの上限(OPEN_MAX)は決まっている.私のシステムでは/usr/include/linux/limits.hにOPEN_MAX 256とある.だから,ファイルディスクリプタを使いまくったら,closeしなけらばならない(256も使わないけど).そういえば,誰かがファイルディスクリプタを開きまくったら,rootでさえファイルディスクリプタを取得できなくなるバグがかつてあった気がする.カーネルだったかな.
ioctlは主にデバイスファイル用の関数である.いろんなデバイスがあるから,各デバイスで利用できる機能が違ってくる.それらの違いをioctlで丸めようという意図じゃないかな.
writeはファイルディスクリプタに書き込んでくれる.
#include <unistd.h> ssize_t write(int fd,const void *buf,size_t count);
- ssize_t
- 書き込まれたバイト数,もしくは-1(エラー時).
- fd
- ファイルディスクリプタ.
- *buf
- バッファ.
- count
- 表示バイト数
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname;int flags); int open(const char *pathname;int flags,mode_t mode);
- 返り値
- ファイルディスクリプタを指す整数.失敗した場合は-1を返す.
- *pathname
- ファイルのパス.
- flags
- 書き込みモード.ファイルがなければ作る,など,いろいろあって,それらをOR(|)で結べる.
- mode
- ファイルを作成するとき,そのファイルにパーミッションを指定できる.整数で755とか指定すると思わぬことになる.ちゃんとmode_tで指定する.ここで指定したパーミッションとumaskを反転させたものとの論理積がファイルに実際に設定されるパーミッションである.
#include <unistd.h> ssize_t read(int fd,void *buf,size_t count);
- ssize_t
- 読み込んだバイト数を返す.失敗したら-1を返す.
- fd
- ファイルディスクリプタ
- buf
- バッファ
- count
- 読み込むバイト数
#include <unistd.h> int close(int fd);
- 返り値
- close成功なら0,失敗なら-1を返す.
- fd
- ファイルディスクリプタ
#include <unistd.h> int fsync(int fd);
- 返り値
- 成功したら0,失敗なら-1を返す.
- fd
- ファイルディスクリプタ
一つのプロセスが開けるファイルディスクリプタの上限(OPEN_MAX)は決まっている.私のシステムでは/usr/include/linux/limits.hにOPEN_MAX 256とある.だから,ファイルディスクリプタを使いまくったら,closeしなけらばならない(256も使わないけど).そういえば,誰かがファイルディスクリプタを開きまくったら,rootでさえファイルディスクリプタを取得できなくなるバグがかつてあった気がする.カーネルだったかな.
ioctlは主にデバイスファイル用の関数である.いろんなデバイスがあるから,各デバイスで利用できる機能が違ってくる.それらの違いをioctlで丸めようという意図じゃないかな.

