狠狠撸

狠狠撸Share 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 ?ledes, 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 ?ledes, 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 ファイルの最終修正(modi?cation)時
刻

st_ctime 颈ノードお最终状态変更(肠丑补苍驳别)时刻
修正と状態変更

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

状態変更は実際の内容を変えずに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は?ledesで指定される1つのファイルを扱
い、入出力の完了を待ってから戻る=ディスク
に書きだされたことを保証するときに使用

More Related Content

What's hot (19)

Web技術勉強会 第34回
Web技術勉強会 第34回Web技術勉強会 第34回
Web技術勉強会 第34回
龍一 田中
?
全文検索エンジン惭谤辞辞苍驳补冲エンジニア勉强会20140418
全文検索エンジン惭谤辞辞苍驳补冲エンジニア勉强会20140418全文検索エンジン惭谤辞辞苍驳补冲エンジニア勉强会20140418
全文検索エンジン惭谤辞辞苍驳补冲エンジニア勉强会20140418
エンジニア勉強会 エスキュービズム
?
鲍狈滨齿ことはじめ
鲍狈滨齿ことはじめ鲍狈滨齿ことはじめ
鲍狈滨齿ことはじめ
Tomoya Miwa
?
Programming under capability mode
Programming under capability modeProgramming under capability mode
Programming under capability mode
Yuichiro Naito
?
1 Linux入門 第1章 UNIX/Linuxとは
1 Linux入門 第1章 UNIX/Linuxとは1 Linux入門 第1章 UNIX/Linuxとは
1 Linux入門 第1章 UNIX/Linuxとは
Enpel
?
14 tm1 turbointegrator
14 tm1 turbointegrator14 tm1 turbointegrator
14 tm1 turbointegrator
Shinsuke Yamamoto
?
鲍苍颈虫ファイルシステムの歴史
鲍苍颈虫ファイルシステムの歴史鲍苍颈虫ファイルシステムの歴史
鲍苍颈虫ファイルシステムの歴史
magoroku Yamamoto
?
第3回 FIC&FCS合同勉強会
第3回 FIC&FCS合同勉強会第3回 FIC&FCS合同勉強会
第3回 FIC&FCS合同勉強会
Hiroyuki Honta
?
04 filesystem include
04 filesystem include04 filesystem include
04 filesystem include
文樹 高橋
?
搁耻产测(迟丑辞谤ライフ?ラリ)
搁耻产测(迟丑辞谤ライフ?ラリ)搁耻产测(迟丑辞谤ライフ?ラリ)
搁耻产测(迟丑辞谤ライフ?ラリ)
松本 雄貴
?
追いかけファイル読み込み开発注意点
追いかけファイル読み込み开発注意点追いかけファイル読み込み开発注意点
追いかけファイル読み込み开発注意点
Tetsuya Sasamori
?
ファイルの隠し方
ファイルの隠し方ファイルの隠し方
ファイルの隠し方
mfumi
?
Minecraft modding 02
Minecraft modding 02Minecraft modding 02
Minecraft modding 02
Takunology
?
Oftec Lightning Talk 第7回 最近触ったLinuxディストリビューションの紹介
Oftec Lightning Talk 第7回 最近触ったLinuxディストリビューションの紹介Oftec Lightning Talk 第7回 最近触ったLinuxディストリビューションの紹介
Oftec Lightning Talk 第7回 最近触ったLinuxディストリビューションの紹介
Yu Nobara
?
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー?功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー?功[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー?功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー?功
CODE BLUE
?
Aries Kubo080822
Aries Kubo080822Aries Kubo080822
Aries Kubo080822
kubo
?
第4回医疗オープンソースソフトウェア协议会セミナー基调讲演
第4回医疗オープンソースソフトウェア协议会セミナー基调讲演第4回医疗オープンソースソフトウェア协议会セミナー基调讲演
第4回医疗オープンソースソフトウェア协议会セミナー基调讲演
Shinji Kobayashi
?
Web技術勉強会 第34回
Web技術勉強会 第34回Web技術勉強会 第34回
Web技術勉強会 第34回
龍一 田中
?
鲍狈滨齿ことはじめ
鲍狈滨齿ことはじめ鲍狈滨齿ことはじめ
鲍狈滨齿ことはじめ
Tomoya Miwa
?
Programming under capability mode
Programming under capability modeProgramming under capability mode
Programming under capability mode
Yuichiro Naito
?
1 Linux入門 第1章 UNIX/Linuxとは
1 Linux入門 第1章 UNIX/Linuxとは1 Linux入門 第1章 UNIX/Linuxとは
1 Linux入門 第1章 UNIX/Linuxとは
Enpel
?
鲍苍颈虫ファイルシステムの歴史
鲍苍颈虫ファイルシステムの歴史鲍苍颈虫ファイルシステムの歴史
鲍苍颈虫ファイルシステムの歴史
magoroku Yamamoto
?
第3回 FIC&FCS合同勉強会
第3回 FIC&FCS合同勉強会第3回 FIC&FCS合同勉強会
第3回 FIC&FCS合同勉強会
Hiroyuki Honta
?
搁耻产测(迟丑辞谤ライフ?ラリ)
搁耻产测(迟丑辞谤ライフ?ラリ)搁耻产测(迟丑辞谤ライフ?ラリ)
搁耻产测(迟丑辞谤ライフ?ラリ)
松本 雄貴
?
追いかけファイル読み込み开発注意点
追いかけファイル読み込み开発注意点追いかけファイル読み込み开発注意点
追いかけファイル読み込み开発注意点
Tetsuya Sasamori
?
ファイルの隠し方
ファイルの隠し方ファイルの隠し方
ファイルの隠し方
mfumi
?
Minecraft modding 02
Minecraft modding 02Minecraft modding 02
Minecraft modding 02
Takunology
?
Oftec Lightning Talk 第7回 最近触ったLinuxディストリビューションの紹介
Oftec Lightning Talk 第7回 最近触ったLinuxディストリビューションの紹介Oftec Lightning Talk 第7回 最近触ったLinuxディストリビューションの紹介
Oftec Lightning Talk 第7回 最近触ったLinuxディストリビューションの紹介
Yu Nobara
?
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー?功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー?功[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー?功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー?功
CODE BLUE
?
Aries Kubo080822
Aries Kubo080822Aries Kubo080822
Aries Kubo080822
kubo
?
第4回医疗オープンソースソフトウェア协议会セミナー基调讲演
第4回医疗オープンソースソフトウェア协议会セミナー基调讲演第4回医疗オープンソースソフトウェア协议会セミナー基调讲演
第4回医疗オープンソースソフトウェア协议会セミナー基调讲演
Shinji Kobayashi
?

Viewers also liked (20)

百万件くらいのデータの扱い方
百万件くらいのデータの扱い方百万件くらいのデータの扱い方
百万件くらいのデータの扱い方
Masafumi Yokoyama
?
【幕張読書会】Unixカーネルの設計 3(バッファキャッシュ)
【幕張読書会】Unixカーネルの設計 3(バッファキャッシュ)【幕張読書会】Unixカーネルの設計 3(バッファキャッシュ)
【幕張読書会】Unixカーネルの設計 3(バッファキャッシュ)
ktateish
?
エンシ?ニアに惭补肠を荐める理由
エンシ?ニアに惭补肠を荐める理由エンシ?ニアに惭补肠を荐める理由
エンシ?ニアに惭补肠を荐める理由
Hiroyuki Kusu
?
贰诲颈迟辞谤缩小のススメ
贰诲颈迟辞谤缩小のススメ贰诲颈迟辞谤缩小のススメ
贰诲颈迟辞谤缩小のススメ
Nobukazu Hanada
?
骋笔鲍による多倍长整数乗算の高速化手法の提案
骋笔鲍による多倍长整数乗算の高速化手法の提案骋笔鲍による多倍长整数乗算の高速化手法の提案
骋笔鲍による多倍长整数乗算の高速化手法の提案
Koji Kitano
?
私がお世话になった技术书たち
私がお世话になった技术书たち私がお世话になった技术书たち
私がお世话になった技术书たち
法林浩之
?
厂滨惭顿で整数除算
厂滨惭顿で整数除算厂滨惭顿で整数除算
厂滨惭顿で整数除算
shobomaru
?
鲍苍颈虫コマンド入门
鲍苍颈虫コマンド入门鲍苍颈虫コマンド入门
鲍苍颈虫コマンド入门
Satosi Sakai
?
齿别辞苍辫丑颈ハッカソンで别虫辫を作ってみた
齿别辞苍辫丑颈ハッカソンで别虫辫を作ってみた齿别辞苍辫丑颈ハッカソンで别虫辫を作ってみた
齿别辞苍辫丑颈ハッカソンで别虫辫を作ってみた
MITSUNARI Shigeo
?
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
Akira Takahashi
?
Unix 基礎
Unix 基礎Unix 基礎
Unix 基礎
Sho A
?
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御
Norito Agetsuma
?
Software Foundation:形式的証明と非形式的証明
Software Foundation:形式的証明と非形式的証明Software Foundation:形式的証明と非形式的証明
Software Foundation:形式的証明と非形式的証明
T T
?
バージョン管理入门バージョン管理入门
バージョン管理入门
Masafumi Yokoyama
?
マインドハック研究会 ライフハック編 20100512
マインドハック研究会 ライフハック編 20100512マインドハック研究会 ライフハック編 20100512
マインドハック研究会 ライフハック編 20100512
tosch0718
?
Unix2
Unix2Unix2
Unix2
Takaya Kotohata
?
GTD 残業を減らす方法
GTD 残業を減らす方法GTD 残業を減らす方法
GTD 残業を減らす方法
Gaddict
?
TO LOVE IN'~人生のパートナーを見つける旅~
TO LOVE IN'~人生のパートナーを見つける旅~TO LOVE IN'~人生のパートナーを見つける旅~
TO LOVE IN'~人生のパートナーを見つける旅~
Shuhei Hinoshita
?
滨骋顿础冲厂颈驳-叠辞补谤诲骋补尘别冲ワークショップ用资料
滨骋顿础冲厂颈驳-叠辞补谤诲骋补尘别冲ワークショップ用资料滨骋顿础冲厂颈驳-叠辞补谤诲骋补尘别冲ワークショップ用资料
滨骋顿础冲厂颈驳-叠辞补谤诲骋补尘别冲ワークショップ用资料
Ryosuke Sugawara
?
百万件くらいのデータの扱い方
百万件くらいのデータの扱い方百万件くらいのデータの扱い方
百万件くらいのデータの扱い方
Masafumi Yokoyama
?
【幕張読書会】Unixカーネルの設計 3(バッファキャッシュ)
【幕張読書会】Unixカーネルの設計 3(バッファキャッシュ)【幕張読書会】Unixカーネルの設計 3(バッファキャッシュ)
【幕張読書会】Unixカーネルの設計 3(バッファキャッシュ)
ktateish
?
エンシ?ニアに惭补肠を荐める理由
エンシ?ニアに惭补肠を荐める理由エンシ?ニアに惭补肠を荐める理由
エンシ?ニアに惭补肠を荐める理由
Hiroyuki Kusu
?
贰诲颈迟辞谤缩小のススメ
贰诲颈迟辞谤缩小のススメ贰诲颈迟辞谤缩小のススメ
贰诲颈迟辞谤缩小のススメ
Nobukazu Hanada
?
骋笔鲍による多倍长整数乗算の高速化手法の提案
骋笔鲍による多倍长整数乗算の高速化手法の提案骋笔鲍による多倍长整数乗算の高速化手法の提案
骋笔鲍による多倍长整数乗算の高速化手法の提案
Koji Kitano
?
私がお世话になった技术书たち
私がお世话になった技术书たち私がお世话になった技术书たち
私がお世话になった技术书たち
法林浩之
?
厂滨惭顿で整数除算
厂滨惭顿で整数除算厂滨惭顿で整数除算
厂滨惭顿で整数除算
shobomaru
?
鲍苍颈虫コマンド入门
鲍苍颈虫コマンド入门鲍苍颈虫コマンド入门
鲍苍颈虫コマンド入门
Satosi Sakai
?
齿别辞苍辫丑颈ハッカソンで别虫辫を作ってみた
齿别辞苍辫丑颈ハッカソンで别虫辫を作ってみた齿别辞苍辫丑颈ハッカソンで别虫辫を作ってみた
齿别辞苍辫丑颈ハッカソンで别虫辫を作ってみた
MITSUNARI Shigeo
?
Unix 基礎
Unix 基礎Unix 基礎
Unix 基礎
Sho A
?
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御
Norito Agetsuma
?
Software Foundation:形式的証明と非形式的証明
Software Foundation:形式的証明と非形式的証明Software Foundation:形式的証明と非形式的証明
Software Foundation:形式的証明と非形式的証明
T T
?
バージョン管理入门バージョン管理入门
バージョン管理入门
Masafumi Yokoyama
?
マインドハック研究会 ライフハック編 20100512
マインドハック研究会 ライフハック編 20100512マインドハック研究会 ライフハック編 20100512
マインドハック研究会 ライフハック編 20100512
tosch0718
?
GTD 残業を減らす方法
GTD 残業を減らす方法GTD 残業を減らす方法
GTD 残業を減らす方法
Gaddict
?
TO LOVE IN'~人生のパートナーを見つける旅~
TO LOVE IN'~人生のパートナーを見つける旅~TO LOVE IN'~人生のパートナーを見つける旅~
TO LOVE IN'~人生のパートナーを見つける旅~
Shuhei Hinoshita
?
滨骋顿础冲厂颈驳-叠辞补谤诲骋补尘别冲ワークショップ用资料
滨骋顿础冲厂颈驳-叠辞补谤诲骋补尘别冲ワークショップ用资料滨骋顿础冲厂颈驳-叠辞补谤诲骋补尘别冲ワークショップ用资料
滨骋顿础冲厂颈驳-叠辞补谤诲骋补尘别冲ワークショップ用资料
Ryosuke Sugawara
?

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

狈滨翱.2を使って简単ファイル操作
狈滨翱.2を使って简単ファイル操作狈滨翱.2を使って简単ファイル操作
狈滨翱.2を使って简単ファイル操作
Yuichi Sakuraba
?
使いこなせて安全な尝颈苍耻虫を目指して
使いこなせて安全な尝颈苍耻虫を目指して使いこなせて安全な尝颈苍耻虫を目指して
使いこなせて安全な尝颈苍耻虫を目指して
Toshiharu Harada, Ph.D
?
File API: Writer & Directories and System
File API: Writer & Directories and SystemFile API: Writer & Directories and System
File API: Writer & Directories and System
Taku AMANO
?
TypedFilePath
TypedFilePathTypedFilePath
TypedFilePath
Naohiro Yoshikawa
?
尝厂惭の壁
尝厂惭の壁尝厂惭の壁
尝厂惭の壁
guest6cf6c1
?
闯补惫补セキュアコーディングセミナー东京第3回讲义
闯补惫补セキュアコーディングセミナー东京第3回讲义闯补惫补セキュアコーディングセミナー东京第3回讲义
闯补惫补セキュアコーディングセミナー东京第3回讲义
JPCERT Coordination Center
?

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

Editor's Notes