2017-09-22AmazonKindle楽天ブックス楽天kobo7netこんにちは。第2版を読んでいるので知識の定着のために学んだ内容を要約したメモを書きます。このエントリは完全な個人のメモです。お勉強のためにこの本を読んでいるので、内容を覚えるためにSummarizing(サマライジング)を行います。ファイルシステムにかかわるAPIこの章で説明することこの章ではディレクトリ操作やファイル操作など、ファイルシステムに関するAPIを説明します。Linuxのディレクトリディレクトリも通常のファイルと基本的には同じで、openしてreadしてcloseすることができます。ディレクトリは普通のファイルとは違い、特定の構造体の列になっています。entry)と呼びます。closeなどで操作するよりも専用APIを使う方が便利です。opendir(3)引数で指定されたパスのディレクトリを開きます。戻り値はDIR型のポインタです。readdir(3)引数で渡されてディレクトリストリームからエントリを1つ読み込みます。direntで返されます。読み込みに失敗するとNULLが返ります。direntの内容はOSによって異なります。closedir(3)引数で渡されたディレクトリストリームを閉じます。closedir(d);}プログラムの説明はプログラム中のコメントを参照。ディレクトリツリーのトラバースディレクトリを再帰的に処理することをディレクトリツリーのトラバースといいます。closedirで地道にディレクトリを辿れば再帰も実装できますが、実装時に「.」や「..」に注意する必要があります。ディレクトリトラバースをしたい場合、「.」を排除しないと無限ループに、「..」を排除しないとルートディレクトリまでたどり着いてファイルシステム全体を処理してしまいます。シンボリックリンクにも注意が必要です。ルートディレクトリを指すシンボリックリンクがある場合、ルートディレクトリ配下すべてが処理され、その中にさらにルートディレクトリを指すシンボリックリンクが含まれるので無限ループに陥ってしまいます。libcにはディレクトリツリーをトラバースするAPIであるfts(3)がありますが、これは可搬性が低いため推奨されません。地道にディレクトリツリーをトラバースするサンプルコードはふつうのLinuxプログラミングのサポートサイトで公開されています。mkdir(2)ディレクトリpathを作成します。引数でパーミッションを指定します。mkdirは比較的失敗しやすいシステムコールです。以下のような原因で失敗することが多いです。・ENOENT親ディレクトリがない・ENOTDIR親ディレクトリに当たる部分がディレクトリではない・EEXIST既に存在する・EPERM親ディレクトリを変更する権限がないumaskumaskはプロセスの属性の1つ。mkdirやopenではパーミッションを指定しますが、実際にはそのパーミッションからumaskに設定された値が落とされたものが使用されます。mkdirで0777を指定してもumaskが022なら、実際のパーミッションは0755になります。umask(2)umaskの値を変更するシステムコール。このシステムコールは失敗することはありません。exit(0);}プログラムの説明はプログラム中のコメントを参照。ディレクトリツリーを作るmkdirコマンドのpオプションのような、親ディレクトリがない場合親ディレクトリも一緒に作るといったことはシステムコールレベルでは一発でできません。地道にディレクトリをチェックして、なかったら作るという処理が必要になります。rmdir(2)引数で指定されたpathのディレクトリを削除します。ディレクトリは空でなくてはいけません。exit(0);}プログラムの説明はプログラム中のコメントを参照。-r相当の操作はできません。これも地道にディレクトリをトラバースして中身を一つずつ消していくしかありません。ハードリンクLinuxでは1つのファイルに2つ以上の名前を付けることができます。この仕組みがリンクです。シンボリックリンクと区別するためにハードリンクということもあります。1つのファイルにaとbという名前を付けた場合、aとbは同じものを指しているので、aを開いて中身を変更したらbも変更されます。-lコマンドでリンクカウントが表示されるので、そこで確認することができます。ファイルに2つ以上のリンク(ファイル名)があるとき、rmコマンドで片方を消してもファイルは残ります。実は、rmコマンドが消すのはファイルではなくリンク(ファイル名)です。ファイルの実体はリンクカウントが0になったときにはじめて削除されます。link(2)ハードリンクを作成するシステムコール。成功したら0を返し、失敗したら-1を返す。ディレクトリに別名を付けることはできない。exit(0);}プログラムの説明はプログラム中のコメントを参照。シンボリックリンクハードリンクがファイルの実体に別名をつけるのに対し、シンボリックリンクは名前に名前を結び付けます。イメージ図は以下のような感じ。ハードリンクとシンボリックリンクのイメージ※画像はふつうのLinuxプログラミング第2版から拝借しています。シンボリックリンクには以下の特徴があります。・シンボリックリンクには対応する実体がなくてもいい・ファイルシステムをまたげる・ディレクトリにも別名を付けられるsymlink(2)シンボリックリンクを作成するシステムコール。成功したら0、失敗したら-1を返します。readlink(2)シンボリックリンクが指している名前を取得するシステムコール。取得した文字列の最後に終端文字(\0)が書き込まれないので注意してください。成功したらバイト数を、失敗したら-1を返します。-sと同じ動きをするものを作ります。exit(0);}プログラムの説明はプログラム中のコメントを参照。まとめ10章はかなりボリュームが多いので、ここで一旦区切ります。第10章の続きはこちら。amistad06-a.hatenablog.comおわり。Linuxの仕組みから学べるgc...2019-05-24筑波大の講義「システムプログラミング」第5回メモこんにちは。プログラミングの勉強のために筑波大の講義「シス...2019-04-05筑波大の講義「システムプログラミング」第4回メモこんにちは。3日目Ubuntuが起動しないときに試したこと月別アーカイブスポンサーリンク【スポンサーリンク】はてなブログをはじめよう!amistad06-kさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。