lstat() - ファイル/シンボリック・リンクの状況の取得

標準

標準/拡張機能 C/C++ 依存項目

z/OS®UNIX
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _POSIX1_SOURCE 2
#include <sys/stat.h>

int lstat(const char *__restrict__ pathname, struct stat *__restrict__ buf);

機能説明

指定ファイルに関する状況情報を取得し、これを buf 引数で示されたメモリーのエリアに入れます。ファイル自身上での許可は必要ありませんが、pathname のすべてのディレクトリー・コンポーネント上での検索許可を持っ ていなければなりません。

指定されたファイルがシンボリック・リンクの場合、lstat() は、シンボリック・リンク自身についての情報を戻します。

情報は、sys/stat.h ヘッダー・ファイルに定義されたように、以下の stat 構造体へ戻されます。

表 1. stat 構造体のエレメント
構造体 説明
mode_t st_mode ファイルの許可と特権を示すビット・ストリング。シンボルは、sys/stat.h ヘッダー・ファイルに定義され、mode_t 値内のビットを参照する。これらのシンボルは chmod() - ファイルまたはディレクトリーのモードの変更 にリストされている。
ino_t st_ino ファイルの通し番号。
dev_t st_dev ファイルを含む装置の数値 ID。
nlink_t st_nlink ファイルへのリンク数。
uid_t st_uid ファイル所有者の数値ユーザー ID。
gid_t st_gid ファイル・グループの数値グループ ID。
off_t st_size 通常のファイルでは、ファイルのサイズ (バイト)。シンボリック・リンクの場合は、リンクに含まれているパス名の長さ (末尾の NULL は数えない)。その他の種類のファイルの場合には、このフィールドの値は未指定です。
time_t st_atime ファイルにアクセスが行われた最新時刻。
time_t st_ctime ファイルの状況が変更された最新時刻。
time_t st_mtime ファイルの内容が変更された最新時刻。

time_t の値は、エポックから経過した秒数で与えられます。

指定されたファイルがシンボリック・リンクの場合、lstat() は、stat 構造体へ情報を入れる前に、時間関連フィールドを更新します。

sys/mode.h ヘッダー・ファイルで定義されているマクロのコレクション を使用して、st_mode フィールドから mode_t 値の特性を確認できます。mode が stat 構造体からの mode_t 値で、genvalue が stat 構造体からの unsigned int 値の場合には、以下のようになります。
S_ISBLK(mode)
ブロック特殊ファイルに対してゼロ以外です。
S_ISCHR(mode)
文字特殊ファイルに対してゼロ以外です。
S_ISDIR(mode)
ディレクトリーに対してゼロ以外です。
S_ISEXTL(mode,genvalue)
外部リンクに対してゼロ以外です。
S_ISFIFO(mode)
パイプおよび FIFO 特殊ファイルに対してゼロ以外です。
S_ISLNK(mode)
シンボリック・リンクに対してゼロ以外です。
S_ISREG(mode)
通常のファイルに対してゼロ以外です。
S_ISSOCK(mode)
ソケットに対してゼロ以外です。

lstat() は、このすべての情報を正常に判別すると、それらの値を buf 引数で示された領域に保管します。

z/OS UNIX の大規模ファイルのサポート: AMODE 64 C/C++ アプリケーションの場合は、z/OS UNIX の大規模ファイルが自動的にサポートされます。AMODE 31 C/C++ アプリケーションは、オプション LANGLVL(LONGLONG) を指定してコンパイルされなければなりません。また、ヘッダーがインクルードされる前に _LARGE_FILES フィーチャー・テスト・マクロを定義して、2 GB のサイズより大きい z/OS UNIX ファイルをこの関数が操作できるようにしなければなりません。ファイル・サイズとオフセット・フィールドは、63 ビットの幅に拡張されます。したがって、_LARGE_FILES フィーチャー・テスト・マクロの定義も行うには、ファイルを操作する他のいずれかの関数が必要です。

戻り値

正常に実行された場合、lstat() は 0 を戻します。

正常に実行されなかった場合、lstat() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EACCES
プロセスに、pathname 接頭部の一部のコンポーネントの検索許可がありません。
EINVAL
buf に NULL が入っています。
EIO
XPG4.2 の追加事項: ファイル・システムからの読み取り中に、入出力エラーが発生しました。
ELOOP
ループがシンボリック・リンクに存在しています。このエラーは、pathname 引数の解析中に検出されたシンボリック・ リンクの数が POSIX_SYMLOOP より大きい場合に発生します。
ENAMETOOLONG
_POSIX_NO_TRUNC が有効ですが、pathnamePATH_MAX 文字より長いか、または pathname の一部のコンポーネントが NAME_MAX 文字より長くなっています。シンボリック・リンクの場合、シンボリック・リンクの代わりに使われるパス名のストリングの長さが PATH_MAX を超えています。PATH_MAXNAME_MAX の値は、pathconf() を使用して確認できます。
ENOENT
pathname という名前のファイルが存在しないか、または pathname が空ストリングです。
ENOTDIR
pathname の接頭部のコンポーネントが ディレクトリーではありません。
EOVERFLOW
ファイル・サイズ (バイト数) またはファイルの割り振られたブロックの数、 またはファイル・シリアル番号を、buf が指す構造体に正しく表すことが できません。
注: z/OS V1.9 以降、 環境変数 _EDC_EOVERFLOW は、z/OS UNIX ファイルの EOVERFLOW 条件の検出に関する lstat() の動作 を制御するために使用できます。デフォルトでは、 buf が指す構造体にファイル・サイズを正しく表すことができない場合、 lstat() は EOVERFLOW を設定しません。_EDC_EOVERFLOW が YES に設定された場合、lstat() は オーバーフロー条件を確認します。

CELEBL12
⁄* CELEBL12

   This example provides status information for a file.

 *⁄
#define _POSIX_SOURCE
#include <fcntl.h>
#include <sys⁄types.h>
#include <sys⁄stat.h>
#include <unistd.h>
#undef _POSIX_SOURCE
#include <stdio.h>
#include <time.h>

main() {
  char fn[]="temp.file", ln[]="temp.link";
  struct stat info;
  int fd;

  if ((fd = creat(fn, S_IWUSR)) < 0)
    perror("creat() error");
  else {
    close(fd);
    if (link(fn, ln) != 0)
      perror("link() error");
    else {
      if (lstat(ln, &info) != 0)
        perror("lstat() error");
      else {
        puts("lstat() returned:");
        printf("  inode:   %d¥n",   (int) info.st_ino);
        printf(" dev id:   %d¥n",   (int) info.st_dev);
        printf("   mode:   %08x¥n",       info.st_mode);
        printf("  links:   %d¥n",         info.st_nlink);
        printf("    uid:   %d¥n",   (int) info.st_uid);
        printf("    gid:   %d¥n",   (int) info.st_gid);
        printf("created:   %s",           ctime(&info.st_createtime));
      }
      unlink(ln);
    }
    unlink(fn);
  }
}
出力:
lstat() returned:
  inode:   3022
 dev id:   1
   mode:   03000080
  links:   2
    uid:   25
    gid:   500
created:   Fri Jun 16 15:00:00 2006

関連情報