SlideShare a Scribd company logo
詳解UNIXプログラミング

 4. ファイルとディレクトリ
stat関数
int stat(const char *pathname, struct stat *buf);

pathnameで指定したファイルに関する情報を
得るために使用

bufが指す構造体に情報を埋め込む
ファイルの種類
(a) ふつうのファイル (b) ディレクトリ (c) 文字
型特殊ファイル (d) ブロック型特殊ファイル
(e) FIFO (f) ソケット (g) シンボリックリンク

特殊ファイルはシステムの装置に使用される

FIFOはプロセス間通信で使用される。名前付
きパイプ
ユーザID/グループID

各プロセスには(1) 実ユーザID (2) 実グループ
ID (3) 実効ユーザID (4) 実効グループID (5) 補
足グループID (6) 保存セットユーザID (7) 保存
セットグループID が存在
実ユーザ/実グループID

実際に誰であるかを表す

ログインしたときにパスワードファイルから取
得

ログインセッションを通じて変化しない
実効ユーザ/グループID

ファイルアクセスパーミッションの決定に使用

通常は実ユーザIDなどに等しい

実効ユーザに所有者を設定することが可能=>
セットユーザIDビット,セットグループIDビッ
ト
ファイルアクセスパーミッション(1)


  いかなるファイルをオープンするときもディレ
  クトリの実行権限が必要

  ディレクトリの実行と読取権限は異なる

  ディレクトリの読取権限があればディレクトリ
  内の全てのファイル名が取得できる
ファイルアクセスパーミッション(2)

 open関数にO_TRUNCフラグを指定するとき
 は書き込み権限が必要

 ディレクトリに書き込み権限と実行権限がない
 と新しいファイルを作成できない

 既存ファイルを削除するにはそのディレクトリ
 に対する書き込み権限と実行権限で必要十分
新規ファイル/ディレクトリ
       の所有権

各プロセスの実効ユーザIDがファイルのユーザ
IDに割り当てられる

ファイルのグループIDは(a)プロセスの実効グ
ループID か (b)そのファイルを収めるディレク
トリのグループID のどちらかを選択できる
access関数

open関数は実効ユーザ/グループIDを使う

場合によっては実ユーザ/グループIDを使いた
い(セットユーザIDを用いて他人のIDでプロセ
スを走らせているときなど)
umask関数
プロセスごとにファイル作成時のパーミッショ
ンを指定できる

umaskの値は、基本的にはログイン時のシェル
の起動ファイルで設定され、以後変更しない

アクセスパーミッションビットが適切に設定さ
れることを保証したい時に使う
chmod/fchmod関数
既存ファイルのファイルアクセスパーミッショ
ンを変更する

int chmod(const char *pathname, mode_t
mode);

int fchmod(int filedes, mode_t mode);

modeは<sys/stat.h>の定数
スティッキービット

S_ISVTXビット (sticky bit)

プログラムが終了してもテキスト領域がスワッ
プ領域に保存される

後のUNIXのバージョンではS_ISVTXビット=
セーブテキストビット
ディレクトリに対する
  スティッキービット
ディレクトリに対してスティッキービットを設
定可能(SVR4と4.3+BSD)

/tmpや/var/spool/uucppublicに利用される

誰もが読み書き実行できるが、名称変更や削
除はさせない
chown,fchown,lchown


ファイルのユーザIDやグループIDを変更

lchownはシンボリックリンクが指すファイル
の代わりにシンボリックリンク自体を変更
ファイルサイズ

普通のファイルは0サイズも許される

普通のファイルには間隔[holl]が含まれても良
い=現在の末尾を超えてシークしてからデータ
を書き込むと発生
ファイルの切り詰め

int truncate(const char *pathname, off_t length)

int ftruncate(int filedes, off_t length)

既存ファイルをlengthバイトに切り詰める

ファイルがlengthより大きいと、lengthバイト
以後のデータは参照できなくなる
ファイルシステム(1)
パーティション       パーティション    パーティション

ブート    スーパー          ディレクトリブロックと
              iリスト
ブロック   ブロック           データブロック




  iノード          ・・・       iノード
ファイルシステム(2)
ディスクの各パーティションにファイルシステ
ムが収められる

iノードは固定長の項目で、ファイルに関する
ほぼ全ての情報を収める

iノードとデータブロックは1:n対応し、n=0と
なったときに初めてデータが解放される
ファイルシステム(3)
         データ               ディレクトリ
iリスト                ・・・             ・・・
         ブロック              ブロック



・・・    iノード   ・・・   iノード




                           iノード   ファイル名
                           番号
ファイルシステム(4)

iノードはファイルシステムをまたげない

iノードにはファイルの種類、アクセスパー
ミッションビット、ファイルサイズ、データブ
ロックへのポインタなどが含まれる
link,unlink関数
int link(const char *existingpath, const char
*newpath);

ハードリンクの作成

int unlink(const char *pathname);

リンクカウントを減少させる

一時ファイルはopenかcreatの直後にunlinkす
るとオープンされているうちは削除されず、ク
ローズか終了時に削除が保証される
remove,rename関数

int remove(const char *pathname);

ファイルに対してはunlinkと等価、ディレクト
リに対してはrmdirと等価

int rename(const char *oldname, const char
*newname);
シンボリックリンク
ファイルシステムの制約がない

誰でもディレクトリに対して作成できる

ファイルを参照する関数がシンボリックリンク
を   るかどうかは覚えないといけない

chownがシンボリックリンクを   るかは実装に
よる
symlink,readlink
int symlink(const char *actualpath, const char
*sympath);

シンボリックリンクを作成する

int readlink(const char *pathname, char *buf,
int bufsize);

リンクを       らず、リンク自身をオープンする場
合はreadlink()を用いる
ファイルの時刻

st_atime ファイルの最終参照(access)時刻

st_mtime ファイルの最終修正(modification)時
刻

st_ctime iノードお最終状態変更(change)時刻
修正と状態変更

修正はファイルのデータ自体を変更すること

状態変更は実際の内容を変えずにiノードに操
作すること(パーミッション変更など)

参照時刻と修正時刻はutime()で変更できる
mkdir,rmdir
int mkdir(const char *pathname, mode_t
mode);

ディレクトリにあるファイル名を参照できるた
めに、実行権限を設定しないといけない

int rmdir(const char *pathname);

ディレクトリのリンクカウントが0になり他の
プロセスが開いてなければ領域は解放される
ディレクトリの読取
ディレクトリ自体に書き込めるのはカーネル

ディレクトリに対する書き込み・実行許可は
ファイルの新規作成やファイルの削除権限

DIR *opendir(const char *pathname);

struct dirent *readdir(DIR *dp)
chdir,fchdir,getcwd

プロセスにはカレント作業ディレクトリが存在

chdirを呼び出すプログラムを実行しても、そ
のプログラムとシェルのカレント作業ディレク
トリは異なるから、シェルから見た作業ディレ
クトリは変更がない点に注意
sync,fsync(1)

ディスク入出力が通過するバッファキャッシュ
がカーネルに存在=遅延出力(delayed write)

バッファを他のディスクブロックに再利用する
必要が生じると、遅延出力ブロックをディスク
に書き込む
sync,fsync(2)
syncは出力用に修正されたブロックバッファを
待ち行列に入れて戻る=実際の入出力の完了を
待たない

fsyncはfiledesで指定される1つのファイルを扱
い、入出力の完了を待ってから戻る=ディスク
に書きだされたことを保証するときに使用

More Related Content

PDF
PDF
LINQ基本のキ
PPTX
Linuxのファイルシステムについて調べてみた
PDF
Open Apostille
PPTX
PDF
Linuxとファイル
KEY
DOC
06 後期勉強会一年の部【加藤】
LINQ基本のキ
Linuxのファイルシステムについて調べてみた
Open Apostille
Linuxとファイル
06 後期勉強会一年の部【加藤】

What's hot (18)

PDF
Web技術勉強会 第34回
PDF
全文検索エンジンMroonga_エンジニア勉強会20140418
PDF
UNIXことはじめ
ODP
Programming under capability mode
ODP
PDF
1 Linux入門 第1章 UNIX/Linuxとは
PDF
14 tm1 turbointegrator
PDF
Unixファイルシステムの歴史
PDF
第3回 FIC&FCS合同勉強会
PDF
04 filesystem include
PDF
Ruby(thorライブラリ)
PDF
追いかけファイル読み込み開発注意点
PDF
ファイルの隠し方
PDF
Minecraft modding 02
PDF
Oftec Lightning Talk 第7回 最近触ったLinuxディストリビューションの紹介
PDF
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
PPT
Aries Kubo080822
ODP
第4回医療オープンソースソフトウェア協議会セミナー基調講演
Web技術勉強会 第34回
全文検索エンジンMroonga_エンジニア勉強会20140418
UNIXことはじめ
Programming under capability mode
1 Linux入門 第1章 UNIX/Linuxとは
14 tm1 turbointegrator
Unixファイルシステムの歴史
第3回 FIC&FCS合同勉強会
04 filesystem include
Ruby(thorライブラリ)
追いかけファイル読み込み開発注意点
ファイルの隠し方
Minecraft modding 02
Oftec Lightning Talk 第7回 最近触ったLinuxディストリビューションの紹介
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
Aries Kubo080822
第4回医療オープンソースソフトウェア協議会セミナー基調講演
Ad

Viewers also liked (20)

PDF
百万件くらいのデータの扱い方
PDF
【幕張読書会】Unixカーネルの設計 3(バッファキャッシュ)
PPTX
エンジニアにMacを薦める理由
PDF
Editor縮小のススメ
PPTX
GPUによる多倍長整数乗算の高速化手法の提案
PDF
私がお世話になった技術書たち
PPTX
SIMDで整数除算
PPTX
Unixコマンド入門
PDF
Xeonphiハッカソンでexpを作ってみた
PDF
Boost.SIMD
PDF
PFI Seminar 2010/02/18
PDF
Unix 基礎
PDF
Unixカーネルの設計 7 プロセスの制御
PDF
Software Foundation:形式的証明と非形式的証明
 
PDF
バージョン管理入門
PPT
マインドハック研究会 ライフハック編 20100512
KEY
PDF
GTD 残業を減らす方法
PPTX
TO LOVE IN'~人生のパートナーを見つける旅~
PPTX
IGDA_Sig-BoardGame_ワークショップ用資料
百万件くらいのデータの扱い方
【幕張読書会】Unixカーネルの設計 3(バッファキャッシュ)
エンジニアにMacを薦める理由
Editor縮小のススメ
GPUによる多倍長整数乗算の高速化手法の提案
私がお世話になった技術書たち
SIMDで整数除算
Unixコマンド入門
Xeonphiハッカソンでexpを作ってみた
Boost.SIMD
PFI Seminar 2010/02/18
Unix 基礎
Unixカーネルの設計 7 プロセスの制御
Software Foundation:形式的証明と非形式的証明
 
バージョン管理入門
マインドハック研究会 ライフハック編 20100512
GTD 残業を減らす方法
TO LOVE IN'~人生のパートナーを見つける旅~
IGDA_Sig-BoardGame_ワークショップ用資料
Ad

Similar to 詳解UNIXプログラミング 第4章 ファイルとディレクトリ (10)

PDF
もっと New I/O。
PDF
NIO.2を使って簡単ファイル操作
PPT
使いこなせて安全なLinuxを目指して
PDF
File API: Writer & Directories and System
PDF
PPTX
TypedFilePath
PPT
LSMの壁
PDF
コード読経会報告書
PDF
Javaセキュアコーディングセミナー東京第3回講義
もっと New I/O。
NIO.2を使って簡単ファイル操作
使いこなせて安全なLinuxを目指して
File API: Writer & Directories and System
TypedFilePath
LSMの壁
コード読経会報告書
Javaセキュアコーディングセミナー東京第3回講義

詳解UNIXプログラミング 第4章 ファイルとディレクトリ

Editor's Notes