4

私はこれを約2時間グーグルで検索していますが、役立つ答えを見つけることができませんでした。

マンページで指定されている「stat」の定義は、st_ctimeフィールドが存在することを示しています。

       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 file system I/O */
           blkcnt_t  st_blocks;  /* number of 512B 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 */
       };

ただし、gcc(標準に従って動作するはずです)を使用しているにもかかわらず、これは私のシステムには当てはまらないようです。

実際、すべての時間フィールド(atime、mtime、ctime)が欠落しているため、構造体には、目的のtime_t値の代わりにtimespecを返すいくつかのatim、mtim、およびctim値が含まれています。

今私の質問:

  1. なんでそうなの?間違ったヘッダーを含めたのかもしれませんが、sys/stat.hである必要があると確信しています。
  2. 私はtimespecについてあまり多くの情報を見つけていません、それは何ですか、そしてなぜそれはここに返されますか?
  3. 回避策を見つけたとしても、それは助けになりますか、それとも他のシステムが私のコードを実行できなくなりますか?

Ubuntu11.10とgcc4.6.1を使用しています。

私のコード(部分的に):

struct stat file_info;
    time_t t;

    if( lstat( path, &file_info ) == 0 ) {

        struct tm* timeinfo;
        t = file_info.st_ctime;
        timeinfo = localtime( &t );

これを手伝っていただければ幸いです。構造体のst_ctimeフィールドを使用してコンパイルできない理由がわかりません。いつものように、gccはエラーについて話すときにあまり役に立ちません。 -)

おそらくそれは#includeの問題で何かをしなければなりませんが、私は何を決定することができません。

4

2 に答える 2

2

POSIX 2008 では、stat() が struct timespec を返す必要があるため、タイムスタンプの小数部分をタイムスタンプの正確な精度に使用できます。1 秒の分解能では、ファイル時間には不十分です。

追加した:

マニュアルページから

カーネル 2.5.48 以降、stat 構造体は 3 つのファイル タイムスタンプ フィールドのナノ秒単位の解像度をサポートしています。_BSD_SOURCE または _SVID_SOURCE 機能テスト マクロが定義されている場合、glibc は st_atim.tv_nsec 形式の名前を使用して各フィールドのナノ秒コンポーネントを公開します。これらのフィールドは POSIX.1-2008 で指定されており、バージョン 2.12 以降では、_POSIX_C_SOURCE が 200809L 以上の値で定義されている場合、または _XOPEN_SOURCE が 700 以上の値で定義されている場合、glibc はこれらのフィールド名も公開します。前述のマクロが定義されていない場合、ナノ秒値は st_atimensec 形式の名前で公開されます。1 秒未満のタイムスタンプをサポートしていないファイル システムでは、ナノ秒フィールドは値 0 で返されます。

于 2011-12-06T17:24:16.650 に答える
0

私のドキュメント ( man lstat) は、含めるヘッダーと、ヘッダーの前に定義する機能テスト マクロ要件を指定します。

#define _POSIX_C_SOURCE 200112L
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

/* use stat, fstat, or lstat */
于 2011-12-06T17:28:04.213 に答える