UNIX 環境での高度なプログラミング - 第 4 章

4.2 stat、fstat、lstat 関数

#include <sys/types.h>
#include <sys/stat.h>

int stat(const char *pathname, struct stat * buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *pathname, struct stat *buf);
  • 3 つの関数は、成功した場合は 0 を返し、失敗した場合は -1 を返します。
  • 3 つの関数の目的は、ファイルに関連する情報構造を取得することですが、stat はパスを提供し、fstat はファイル記述子を提供し、lstat のパスはシンボリック リンクのパスです。

4.3 ファイルの種類

  1. 通常ファイル
  2. ディレクトリ ファイル: ディレクトリ ファイルの読み取り権限を持つすべてのプロセスは、ディレクトリの内容を読み取ることができますが、ディレクトリ ファイルに書き込むことができるのはカーネルだけです。
  3. キャラクター特殊ファイル
  4. ブロック スペシャル ファイル: このタイプのファイルは通常、ディスク デバイスに使用されます。システム内のすべてのデバイスは、キャラクタ スペシャル ファイルまたはブロック スペシャル ファイルのいずれかです。
  5. FIFO: このファイルは構築および構築通信に使用され、名前付きパイプと呼ばれることもあります。
  6. Socket: このファイルはプロセス間通信に使用されます
  7. シンボリックリンク

4.4 設定ユーザーIDと設定グループID

  • ファイル モード ワード (st_mode) に特別なフラグを設定できます。その定義は、「このファイルを実行するときに、プロセスの実効ユーザー ID をファイルの所有者 (st_uid) に設定します」です。
  • ファイルモードワードに別のビットを設定できます。これにより、ファイルを実行しているプロセスの実効グループ ID がファイルのグループ所有者に設定されます。

4.5 ファイル アクセス許可

  • st_mode には、ファイルのアクセス許可ビットも含まれています

4.6 新しいファイルとディレクトリの所有権

  • 新しいファイルのグループ ID は、プロセスの有効なグループ ID にすることができます
  • 新しいファイルのグループ ID は、そのファイルがあるディレクトリのグループ ID にすることができます。

4.7 アクセス機能

  • アクセス機能は、実際のユーザーIDと実際のグループIDに基づいてアクセス許可をテストします
  • アクセス関数の範囲 0 は成功を意味し、-1 はエラーを意味します
#include <unistd.h>

int access(const char *pathname, int mode);
モード 例証する
R_OK 読み取り権限のテスト
W_OK 書き込み権限のテスト
X_OK テスト実行権限
F_OK ファイルの存在をテストする

4.8 umask 関数

  • umask 関数は、プロセスのファイル モード マスクを設定し、以前の値を返します。
  • cmask は、次の表の 9 つの定数 (S_IRUSR、S_IWUSR など) で構成されます。
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t cmask)
st_mode マスク 意義
S_IRUSR ユーザー読み取り
S_IWUSR ユーザー書き込み
S_IXUSR ユーザー実行
S_IRGRP グループ読み取り
S_IWGRP グループ - 書き込み
S_IXGRP グループ実行
S_IROTH その他 - 読む
S_IWOTH その他 - 書く
S_IXOTH その他の実行

4.9 chmod および fchmod 関数

#include <sys/types.h>
#include <sys/stat.h>
int chmod(const char *pathname, mode_t mode);
int fchmod(int filedes, mode_t mode);

4.10 スティッキービット

今は必要ない

4.11 chown、fchown、lchown 関数

  • 3 つの関数の戻り値: 成功した場合は 0、エラーの場合は -1
#include <sys/types.h>
#include <unistd.h>
int chown(const char *pathname, uid_t owner, gid_t group);
int fchown(int filedes, uid_t owner, gid_t group);
int lchown(const char *pathname, uid_t owner, gid_t group);

4.12 ファイル長

  • stat 構造体のメンバー st_size には、ファイルの長さ (バイト単位) が含まれます. このフィールドは、通常のファイル、ディレクトリファイル、およびシンボリックリンクに対してのみ意味があります.

4.13 ファイルの切り捨て

  • ファイルを短くするために、ファイルの末尾にある一部のデータを切り捨てます
  • 長さを 0 に切り捨てます。これは O_TRUNC フラグで行います
  • どちらの関数も次を返します: 成功した場合は 0、エラーの場合は -1
#include <sys/types.h>
#include <unistd.h>
int truncate(const char *pathname, off_t length);
int ftruncate(int filedes, off_t length);

4.14 ファイルシステム

ここに画像の説明を挿入- グラフには、同じ i ノードのみを必要とする 2 つのディレクトリ エントリがあることに注意してください。接続テクノロジが 0 に削減されると、このファイルを削除できます. stat 構造体では、接続カウントは st_nlink メンバーに含まれ、その基本的なシステム データ型は nlink_t です。

  • 別のタイプの接続はシンボリック リンクと呼ばれます。この接続についての私の理解は、Windows の下のショートカットです。
  • i ノードには、ファイルに関連するすべての情報が含まれます: ファイル タイプ、ファイル アクセス許可ビット、ファイル長、変更されたファイルが占めるデータ ブロックへのポインタなど; stat 構造体のほとんどの情報は i ノードから取得されます。 ;

4.15 リンク、リンク解除、削除、名前変更機能

  • どのファイルも、複数のディレクトリ エントリとその i ノードを持つことができます。既存のファイルにリンクする 1 つの方法は、リンク機能を使用することです。
  • リンク解除機能により、既存のディレクトリ エントリを削除できます
  • remove 関数は、ファイルまたはディレクトリのリンクを解除します。ファイルの場合、remove の関数は unlink と同じです。ディレクトリの場合、remove の関数は rmdir と同じです。
  • 名前変更機能を使用してファイルまたはディレクトリの名前を変更する
#include <unistd.h>
int link(const char *existingpath, const char *newpath);
int unlink(const char *pathname);

#include <stdio.h>
int remove(const char *pathname);
int rename(const char *oldname, const char *newname);

4.17 symlink および readlink 関数

  • symlink 関数はシンボリック リンクを作成します

4.18 ファイル時間

分野 例証する ls(l) オプション
st_atime ファイルデータの最終アクセス時刻 読む -u
st_mtime ファイルデータの最終変更時刻 書く デフォルト
st_ctime inode 状態の最終変更時刻 chmod、chown -c

4.19 utime 関数

ファイルのアクセス時間と変更時間は utime 関数で変更できます

4.20 mkidr および rmdir 関数

mkdir 関数を使用してディレクトリを作成し、rmdir 関数を使用してディレクトリを削除します。

4.21 ディレクトリの読み込み

4.22 chdir、fchdir、getcwd 関数

  • プロセスは chdir または fchdir 関数を呼び出して、現在の作業ディレクトリを変更します
  • getcwd は現在のディレクトリを取得できます

おすすめ

転載: blog.csdn.net/u012850592/article/details/103061521