Unix-system-calls-lstat

提供:Dev Guides
移動先:案内検索

[top]#

[[File:]]

[[File:]]

|Web |This Site

  • 初心者向けのUnix *
  • 高度なUnix *

選択した読書

Copyright©2014 by finddevguides

  Home     References     Discussion Forums     About TP  

stat()-Unix、Linuxシステムコール

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]

広告

NAME

stat、fstat、lstat-ファイルの状態を取得

概要

  • #include <sys/types.h> * *#include <sys/stat.h> * *#include <unistd.h> *
  • int stat(const char * path 、struct stat *buf ); * int fstat(int filedes、struct stat '''buf ); * *int lstat (const char * path 、struct stat * buf ); *

説明

これらの関数は、ファイルに関する情報を返します。 ファイル自体に対する権限は必要ありませんが、- stat ()および lstat ()の場合-ファイルにつながる_path_内のすべてのディレクトリに対する実行(検索)権限が必要です。

*stat* ()は、_path_が指すファイルを統計し、_buf_を埋めます。
*lstat* ()は *stat* ()と同じですが、_path_がシンボリックリンクの場合、参照するファイルではなく、リンク自体がstat-edになります。
*fstat* ()は、stat-edするファイルがファイル記述子_filedes_によって指定されることを除いて、 *stat* ()と同じです。

これらのシステムコールはすべて、次のフィールドを含む_stat_構造体を返します。

struct stat { dev_t st_dev; /*ID of device containing file*/ ino_t st_ino; /*inode number*/ mode_t st_mode; /*protection*/ nlink_t st_nlink; /*number of hard links*/ uid_t st_uid; /*user ID of owner*/ gid_t st_gid; /*group ID of owner*/ dev_t st_rdev; /*device ID (if special file)*/ off_t st_size; /*total size, in bytes*/ blksize_t st_blksize;/*blocksize for filesystem I/O*/ blkcnt_t st_blocks; /*number of blocks allocated*/ time_t st_atime; /*time of last access*/ time_t st_mtime; /*time of last modification*/ time_t st_ctime; /*time of last status change*/ };

_st_dev_フィールドは、このファイルが存在するデバイスを示します。

_st_rdev_フィールドは、このファイル(inode)が表すデバイスを示します。

_st_size_フィールドは、ファイルのサイズ(通常のファイルまたはシンボリックリンクの場合)をバイト単位で示します。 シンボリックリンクのサイズは、それに含まれるパス名の長さであり、末尾のヌルバイトはありません。

st_blocks_フィールドは、ファイルに割り当てられたブロック数を512バイト単位で示します。 (これは、ファイルに穴がある場合など、_st_size/512よりも小さい場合があります。)

_st_blksize_フィールドは、効率的なファイルシステムI/Oの「優先」ブロックサイズを提供します。 (小さなチャンクでファイルに書き込むと、非効率的な読み取り-変更-書き換えが発生する場合があります。)

すべてのLinuxファイルシステムがすべての時間フィールドを実装しているわけではありません。 一部のファイルシステムタイプでは、ファイルアクセスによって_st_atime_フィールドが更新されないようにマウントできます。 ( mount (8)の「noatime」を参照してください。)

フィールド_st_atime_は、ファイルアクセスによって変更されます。 execve (2)、 mknod (2)、 pipe (2)、 utime (2)および read (2)(0バイト以上)。 mmap (2)などの他のルーチンは、_st_atime_を更新する場合としない場合があります。

フィールド_st_mtime_は、ファイルの変更によって変更されます。 mknod (2)、 truncate (2)、 utime (2)および write (2)(0バイト以上)。 さらに、ディレクトリの_st_mtime_は、そのディレクトリ内のファイルの作成または削除によって変更されます。 _st_mtime_フィールドは、所有者、グループ、ハードリンクカウント、またはモードの変更に対しては変更されません。

フィールド_st_ctime_は、書き込みまたはinode情報(所有者、グループ、リンクカウント、モードなど)の設定によって変更されます。

_st_mode_フィールドを使用してファイルタイプをチェックするために、次のPOSIXマクロが定義されています。

Tag Description
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)

_st_mode_フィールドには、次のフラグが定義されています。

S_IFMT 0170000 bitmask for the file type bitfields
S_IFSOCK 0140000 socket
S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file
S_IFBLK 0060000 block device
S_IFDIR 0040000 directory
S_IFCHR 0020000 character device
S_IFIFO 0010000 FIFO
S_ISUID 0004000 set UID bit
S_ISGID 0002000 set-group-ID bit (see below)
S_ISVTX 0001000 sticky bit (see below)
S_IRWXU 00700 mask for file owner permissions
S_IRUSR 00400 owner has read permission
S_IWUSR 00200 owner has write permission
S_IXUSR 00100 owner has execute permission
S_IRWXG 00070 mask for group permissions
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 mask for permissions for others (not in group)
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission

set-group-IDビット(S_ISGID)にはいくつかの特別な用途があります。 ディレクトリの場合、BSDセマンティクスがそのディレクトリに使用されることを示します:そこに作成されたファイルは、作成プロセスの有効なグループIDからではなく、ディレクトリからグループIDを継承し、そこに作成されたディレクトリもS_ISGIDビットセットを取得します。 グループ実行ビット(S_IXGRP)が設定されていないファイルの場合、set-group-IDビットは必須のファイル/レコードロックを示します。

ディレクトリの「スティッキー」ビット(S_ISVTX)は、そのディレクトリ内のファイルの名前を変更または削除できるのは、ファイルの所有者、ディレクトリの所有者、および特権プロセスのみであることを意味します。

Linuxノート

カーネル2.5.48以降、_stat_構造は3つのファイルタイムスタンプフィールドのナノ秒の解像度をサポートします。 Glibcは、_BSD_SOURCEまたは_SVID_SOURCE機能テストマクロが定義されている場合は_st_atim.tv_nsec_形式の名前を使用して、またはこれらのマクロのどちらも定義されていない場合は_st_atimensec_形式の名前を使用して各フィールドのナノ秒コンポーネントを公開します。 1秒未満のタイムスタンプをサポートしないファイルシステムでは、これらのナノ秒フィールドは値0で返されます。

_/proc_ディレクトリにあるほとんどのファイルでは、 stat ()は_st_size_フィールドにファイルサイズを返しません。代わりに、フィールドは値0で返されます。

返り値

成功すると、ゼロが返されます。 エラーの場合、-1が返され、_errno_が適切に設定されます。

エラー

Tag

説明

*EACCES*

_path_のパスプレフィックス内のディレクトリの1つに対する検索許可が拒否されました。 ( path_resolution (2)も参照してください。)

*EBADF*

_filedes_が悪いです。

*EFAULT*

住所が間違っています。

*ELOOP*

パスのトラバース中に検出されたシンボリックリンクが多すぎます。

*ENAMETOOLONG*

ファイル名が長すぎます。

*ENOENT*

パス_path_のコンポーネントが存在しないか、パスが空の文字列です。

*ENOMEM*

メモリー不足(つまり、 カーネルメモリ)。

*ENOTDIR*

パスのコンポーネントはディレクトリではありません。

準拠

これらのシステムコールは、SVr4、4.3BSD、POSIX.1-2001に準拠しています。

_st_blocks_および_st_blksize_フィールドを使用すると、移植性が低下する場合があります。 (BSDで導入されました。 解釈はシステム間で異なり、NFSマウントが関係する場合はおそらく単一のシステム上で行われます。

POSIXはS_IFMT、S_IFSOCK、S_IFLNK、S_IFREG、S_IFBLK、S_IFDIR、S_IFCHR、S_IFIFO、S_ISVTXビットを記述しませんが、代わりにマクロS_ISDIR()などの使用を要求します。 S_ISLNKおよびS_ISSOCKマクロはPOSIX.1-1996にはありませんが、両方ともPOSIX.1-2001にあります。前者はSVID 4から、後者はSUSv2からです。

Unix V7(およびそれ以降のシステム)にはS_IREAD、S_IWRITE、S_IEXECがあり、POSIXは同義語S_IRUSR、S_IWUSR、S_IXUSRを規定しています。

その他のシステム

さまざまなシステムで使用されている(または使用されている)値:

hex

name

ls

8進数

説明

f000

S_IFMT

170000

ファイルタイプのマスク

0000

000000

SCOのアウトオブサービスiノード、BSD不明タイプ

SVID-v2とXPG2には、通常ファイルの0と0100000の両方があります

1000

S_IFIFO

p|

010000

FIFO(名前付きパイプ)

2000

S_IFCHR

c

020000

キャラクタースペシャル(V7)

3000

S_IFMPC

030000

多重化文字特殊(V7)

4000

S_IFDIR

d/

040000

ディレクトリ(V7)

5000

S_IFNAM

050000

XENIX名前付き特殊ファイル

st_rdev値1、2で区別される2つのサブタイプ

0001

S_INSEM

s

000001

IFNAMのXENIXセマフォサブタイプ

0002

S_INSHD

m

000002

IFNAMのXENIX共有データサブタイプ

6000

S_IFBLK

b

060000

ブロックスペシャル(V7)

7000

S_IFMPB

070000

多重化ブロック特殊(V7)

8000

S_IFREG

-

100000

レギュラー(V7)

9000

S_IFCMP

110000

VxFS圧縮

9000

S_IFNWK

n

110000

ネットワークスペシャル(HP-UX)

a000

S_IFLNK

l@

120000

シンボリックリンク(BSD)

b000

S_IFSHAD

130000

ACLのSolarisシャドウiノード(ユーザー空間には表示されません)

c000

S_IFSOCK

s=

140000

ソケット(BSD、VxFSの「S_IFSOC」)

d000

S_IFDOOR

D>

150000

ソラリスドア

e000

S_IFWHT

w%

160000

BSDホワイトアウト(iノードには使用されません)

0200

S_ISVTX

001000

「スティッキービット」:使用後もスワップされたテキストを保存する(V7)

予約済み(SVID-v2)

ディレクトリ以外の場合:このファイルをキャッシュしないでください(SunOS)

ディレクトリ上:制限付き削除フラグ(SVID-v4.2)

0400

S_ISGID

002000

実行時のグループIDの設定(V7)

ディレクトリの場合:GIDの伝播にBSDセマンティクスを使用

0400

S_ENFMT

002000

SysVファイルロックの強制(S_ISGIDと共有)

0800

S_ISUID

004000

実行時のset-user-ID(V7)

0800

S_CDF

004000

ディレクトリはコンテキスト依存ファイル(HP-UX)

スティッキーコマンドは、バージョン32V AT&T UNIXで登場しました。

関連項目

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]

広告

  
Advertisements