opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

UNIXのstat関数

UNIX及びUNIX系OSではファイルなどの情報を取得するときsys/stat.hなどをインクルードしてstat構造体などを使って情報を得ることができる。

結構調べたけど意外と資料が少ないのでメモ。
意外と英語版Wikipediaが詳しい Link

まずUNIXでファイルの情報(例えばアクセス権とか)を調べるときは以下のヘッダーをインクルードする

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

あとは表示させたければstdio.hなどもインクルードしておく。

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

int main(int argc,char* argv[]){
   
 struct stat buf;
 if(stat(argv[1],&buf) != 0) return 1; //エラー終了
....
}

のようにstat関数にstruct statの変数のポインタと調べたいファイルのPATHを渡す。今回はargv[1] つまり第一引数に渡された値がファイル名になる。
成功すれば0を返すのでそれ以外だと失敗になる。失敗時にエラー終了するようにしている。

以下Wikipediaより

     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 */
     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 */
     blksize_t   st_blksize; /* blocksize for filesystem I/O */
     blkcnt_t    st_blocks;  /* number of blocks allocated */

Wikipediaによると上のような値が用意されてるらしい。左が型で真ん中が値。
例えばuidなどを取得したいと思った場合は

.... (上に書いたコード は省略)
   uid_t uid =  buf.st_uid;
...

などとすればいい。実際uid_t型は整数型のようなので

...
   int uid = (int)buf.st_uid;
...

としてキャストさせておけばintで扱える。 ファイルを所有してるユーザーのuidが返る。
例えば 501 など。
ちなみに自分のuidやgidなんかは

$ id username

というコマンドで調べられるよ
こんな感じで... (ArchLinuxの自分のユーザー)

というか時計くるってるw
プロンプトに時間表示させてるんだけど・・・というかアレ...インストール時にちゃんとタイムゾーン決めたような・・・

同じようにして他の値も得ることができる。 だいたいの型は整数型のようなので適当な整数型にキャストすれば使える。

とりあえず実際に使うなら一回取得して表示してみるとよくわかると思う.

Firefox ブラウザ無料ダウンロード