stat(시스템콜)

stat (system call)
stat명령줄

stat()inode에 대한 파일 속성을 반환하는 UNIX 시스템콜입니다stat()의 의미는 운영체제마다 다릅니다.예를 들어 Unix 명령어ls 시스템콜을 사용하여 다음 파일을 포함한 정보를 가져옵니다.

  • atime: 마지막 액세스 시각(ls - lu)
  • mtime: 최종 변경 시각(ls - l)
  • ctime: 마지막 상태 변경 시각(ls - lc)

stat버전 1 Unix표시됩니다.버전 4에서는 그룹 권한이 추가되고 파일 크기[1]더 커짐에 따라 변경해야 하는 몇 안 되는 Unix 시스템 호출 중 하나입니다.

stat() 함수

POSIX 및 기타 Unix와 유사한 운영체제시스템에 있는 C POSIX 라이브러리 헤더 sys/stat.h는 다음을 선언합니다.stat()기능 및 관련 기능fstat()그리고.lstat()이 함수는struct statbuffer 인수. 파일 속성을 반환하기 위해 사용됩니다.성공 시 함수는 0을 반환하고 오류 시 -1이 반환되며 errno가 적절하게 설정됩니다.

stat()그리고.lstat()함수는 filename 인수를 사용합니다.파일이 심볼릭 링크일 경우stat()는 링크의 최종 타깃 속성을 반환합니다.lstat()링크 자체의 Atribut을 클릭합니다.fstat()function은 파일 기술자 인수를 대신 사용하여 지정된 파일의 속성을 반환합니다.

기능 패밀리는 대용량 파일 지원을 구현하도록 확장되었습니다.명명된 함수stat64(),lstat64()그리고.fstat64()의 속성을 반환하다struct stat64structure: 64비트 타입의 파일사이즈를 나타내며, 2 GiB 이상의 파일(최대 8 EiB)에서 기능을 실행할 수 있습니다.언제?_FILE_OFFSET_BITS 매크로는 64로 정의되어 있습니다.이러한 64비트 함수는 원래 이름으로 사용할 수 있습니다.

함수는 다음과 같이 정의됩니다.

인트 상태(컨스턴트  *파일명, 구조 상태 *부프); 인트 상태(컨스턴트  *파일명, 구조 상태 *부프); 인트 fstat(인트 파일, 구조 상태 *부프); 

상태 구조

이 구조는 sys/stat.h 헤더파일에 다음과 같이 정의되어 있습니다만,[2] 실장에서는 추가 필드를 자유롭게 정의할 수 있습니다.

구조 상태 {  모드_t   st_mode(모드);  ino_t   st_ino;  dev_t   st_dev;  dev_t   st_rdev;  nlink_t   st_nlink;  uid_t   st_uid;  gid_t   st_displays(표준);  오프_t   표준 사이즈;  구조 시간 사양 st_atim;  구조 시간 사양 st_mtim;  구조 시간 사양 st_ctim;  사이즈 변경_t  st_blocksize(블랙사이즈);  blkcnt_t  st_blocks; }; 

POSIX.1은 필요 없습니다.st_rdev,st_blocks그리고.st_blksize멤버. 이러한 필드는 싱글유닉스 사양의 XSI 옵션의 일부로 정의되어 있습니다.

POSIX.1 규격의 이전 버전에서는 시간 관련 필드는 다음과 같이 정의되었습니다.st_atime,st_mtime그리고.st_ctime, 및 의 종류입니다.time_t. 2008년판 표준 이후 이러한 필드의 이름은 다음과 같이 변경되었습니다.st_atim,st_mtim그리고.st_ctim각각 유형 구조의timespec이 구조는 고해상도 시간 단위를 제공하기 때문입니다.호환성을 위해 구현에서는 오래된 이름을 다음과 같이 정의할 수 있습니다.tv_sec멤버struct timespec.예를들면,st_atime라고 정의할 수 있다st_atim.tv_sec를 클릭합니다.[2]

struct stat구조에는 적어도 다음 멤버가 포함됩니다.

  • st_dev– 파일을 포함하는 디바이스 식별자
  • st_inoinode 번호
  • st_mode보호 모드. "유닉스 권한"도 참조하십시오.
  • st_nlink하드 링크 참조
  • st_uid소유자의 사용자 ID
  • st_gid소유자의 그룹 식별자
  • st_rdev– 디바이스 식별자(특수 파일인 경우)
  • st_size– 총 파일 크기(바이트)
  • st_atime– 최종 액세스 시각
  • st_mtime– 최종 변경 시각
  • st_ctime– 마지막 상태 변경 시각
  • st_blksize– 파일 시스템 I/O에 적합한 블록 크기(시스템과 파일 시스템[3] 유형에 따라 다름)
  • st_blocks– 배수로 할당된 블록의 수DEV_BSIZE(통상은 512바이트).

st_modefield는 비트필드입니다파일 액세스 모드를 조합하고, 특수한 파일 타입도 나타냅니다.다양한 모드 플래그와 파일 타입으로 작업할 수 있는 매크로가 많이 있습니다.

앳타임에 대한 비판

파일을 읽으면 시간이 변경되어 결국 디스크 쓰기가 필요하게 됩니다.는 읽기 전용 파일 시스템과 일관성이 없기 때문에 비판을 받아 왔습니다.파일 시스템 캐시는 캐시 플러시당 디스크 쓰기 작업을 1회로 크게 줄일 수 있습니다.

Linux 커널 개발자인 Ingo Molnarr는 2007년 [4][5]atime의 개념과 퍼포먼스에 대한 영향을 공개적으로 비판했으며 2009년에는 relative time 마운트 옵션이 기본값이 되어 이 비판에 [6]대처했습니다.relative time mount 옵션의 이면에 있는 동작은 대부분의 목적에 충분한 성능을 제공하며, 광범위하게 [7]논의된 바와 같이 중요한 응용 프로그램이 중단되는 일은 없습니다.처음에 relative time은 atime < mtime 또는 atime < ctime인 경우에만 atime을 갱신했습니다.이 후 tmpwatch 및 Debian의 인기 카운터(popcon)가 정상적으로 [8]동작하도록 수정되었습니다.

Linux 커널의 현재 버전은 fstab에서 지정할 수 있는 4가지 마운트 옵션을 지원합니다.

  • strictatime(이전에는 atime, 이전에는 디폴트)– 항상 atime을 갱신합니다.이것은 POSIX에서 정의된 동작에 준거합니다.
  • relatime (2.6.20에서 도입되어 2.6.30에서의 디폴트)– 특정 상황에서만 갱신: 이전 시간이 mtime 또는 ctime보다 오래된 경우 또는 이전 시간이 과거 24시간 이상인 경우
  • nodiratime – 디렉토리 시간에는 업데이트하지 않지만 다른 파일 시간에는 업데이트하십시오.
  • noatime – 파일 또는 디렉토리의 시간 내에 업데이트하지 않음.노디라타임을 의미.최고 퍼포먼스는 높지만 호환성은 낮다.
  • laty time – 아래에 제시된 특정 상황에 따라 시간대를 업데이트합니다.

Linux, macOS, Solaris, FreeBSDNetBSD현재 버전은 /etc/fstab의 noatime 마운트 옵션을 지원하므로 atime 필드가 업데이트되지 않습니다.시간 업데이트를 끄면 POSIX 컴플라이언스 및 mbox 기반 "new mail"[9] 알림과 같은 일부 응용 프로그램 및 일부 파일 사용률 감시 유틸리티(특히 tmpwatch)가 위반됩니다.

OpenBSDnoatime 옵션은 Linux relative [10]time과 같은 동작을 합니다.

2015년 4월 12일에 출시된 Linux 커널 메인라인 버전 4.0은 새로운 마운트 옵션인 lazytime을 도입했습니다.POSIX 스타일의 타임업데이트를 메모리 내에서 실행하여 동일한 파일 상에서 시간 관련성이 없는 I/O 조작과 함께 디스크에 플래시할 수 있습니다.타임업데이트는 동기 시스템콜의 일부가 실행되었을 때 또는 파일의 메모리 내 in-memory inode가 파일 시스템캐시에서 삭제되기 전에 디스크로 플래시 됩니다.또한 시간 변경을 플러시되지 않은 상태로 유지할 수 있는 시간을 설정할 수 있습니다.이렇게 하면 레이지타임은 POSIX 호환성을 유지하면서 [11][12]퍼포먼스를 향상시킬 수 있습니다.

시간

원래 ctime이 작성 [13]시간을 의미한다고 믿는 것은 유혹적입니다.그러나 초기 Unix에는 수정과 작성 시간이 있었지만, 후자는 ctime을 호출하는 C구조가 존재하기 전에 액세스 시간으로 변경되었습니다.파일 시스템은 6th Edition Unix를 통해 액세스 시간(시간)과 수정 시간(mtime)만 유지했습니다.ctime 타임스탬프는 7th Edition Unix에서 발생한 파일시스템 재구축에서 추가되어 inode 변경 시간을 항상 참조하고 있습니다.파일 권한, 파일 소유권, 하드 링크 생성 삭제 등 inode에 저장된 파일 메타데이터가 변경될 때마다 업데이트됩니다.일부 구현에서 ctime은 파일 이름 변경의 영향을 받습니다.원래 Unix는 링크 작성(ctime 갱신)과 오래된 이름 링크 해제(ctime 재갱신)를 통해 이름 변경을 구현합니다.또한 최신 Linux는 이를 실행하는 경향이 있습니다.

atimemtime과 달리 ctimetouch 유틸리티에서 사용되는 것처럼 utime()을 사용하여 임의의 값으로 설정할 수 없습니다.대신 utime()이 사용되는 경우 또는 파일에 대한 액세스로 인한 atime 업데이트 이외의 inode에 대한 기타 변경에 대해서는 ctime 값이 현재 시간으로 설정됩니다.

시간 정밀도

  • time_t를 지정하면 1초에 대한 정확한 배수가 제공됩니다.
  • 일부 파일 시스템은 보다 세밀한 정보를 제공합니다.Solaris 2.1에서는 1992년에[citation needed] UFS에서는 마이크로초 해상도를, ZFS에서는 [citation needed]나노초 해상도를 도입했습니다.
  • Linux 커널 2.5.48 이상에서는 stat 구조는 3개의 파일 타임스탬프 필드에 대해 나노초 해상도를 지원합니다.이러한 필드는 stat [14][15]구조에서 추가 필드로 표시됩니다.
  • FAT 파일 시스템의 작성 시간의 해상도는 10밀리초이며, 기입 시간의 해상도는 2초이며, 액세스 시간의 해상도는 1일이므로 액세스 날짜로 [16]기능합니다.

#실패하다 <stdio.h> #실패하다 <stdlib.h> #실패하다 <time.h>  #실패하다 < sys / types >h> #실패하다 <pwd.h> #실패하다 <grp.h> #실패하다 <sys/stat.h>  인트 주된(인트 argc,  *argv[]) {   구조 상태 어떤 일을 맡다;  구조 패스워드 *pwuser;  구조 그룹. *grpnam;   한다면 (argc < > 2)  {   인쇄(하드, "사용방법: %s: 파일...\n", argv[0]);   퇴장(EXIT_FAILURE);  }   위해서 (인트 i = 1; i < > argc; i++)  {   한다면 (-1 == 상태(argv[i], &어떤 일을 맡다))   {    에러("stat()");    퇴장(EXIT_FAILURE);   }    한다면 (특수한 순서 == (pwuser = getpwuid를 사용하다(어떤 일을 맡다.st_uid)))   {    에러("getpwuid()");    퇴장(EXIT_FAILURE);   }    한다면 (특수한 순서 == (grpnam = getgrid(게시판)(어떤 일을 맡다.st_displays(표준))))   {    에러("getgrgid()");    퇴장(EXIT_FAILURE);   }    인쇄물(%s:\n", argv[i]);   인쇄물("\tinode: %u\n", 어떤 일을 맡다.st_ino);   인쇄물("\t소유자: %u (%s)\n", 어떤 일을 맡다.st_uid, pwuser->pw_name);   인쇄물("\t그룹: %u (%s)\n", 어떤 일을 맡다.st_displays(표준), grpnam->gr_name);   인쇄물("\t파마: %o\n", 어떤 일을 맡다.st_mode(모드) & (S_IRWXU   S_IRWXG   S_IRWXO));   인쇄물("\t링크: %d\n", 어떤 일을 맡다.st_nlink);   인쇄물("\t크기: %ld\n", 어떤 일을 맡다.표준 사이즈); /* %lld */ 를 사용할 수 있습니다.   인쇄물("\t시간: %s", 시간(&어떤 일을 맡다.st_atim.TV_sec));   인쇄물("\tmtime: %s", 시간(&어떤 일을 맡다.st_mtim.TV_sec));   인쇄물("\tctime: %s", 시간(&어떤 일을 맡다.st_ctim.TV_sec));    인쇄물("\n");  }   돌아가다 0; } 

레퍼런스

  1. ^ McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. 139.
  2. ^ a b Stevens & Rago 2013, 페이지 94. 오류:: Rago 2013
  3. ^ "<sys/stat.h>". The Open Group Base Specifications Issue 6—IEEE Std 1003.1, 2004 Edition. The Open Group. 2004.
  4. ^ 커널 트랩: Linux: atime With relative time으로 대체, 2007년 8월 7일 제레미가 작성
  5. ^ 옛날 옛적, LWN, Jonathan Corbet, 2007년 8월 8일
  6. ^ Linux 커널 2.6.30, Linux 커널 뉴비
  7. ^ Jonathan Corbet의 방대한 파일 시스템 스레드 LWN, 2009년 3월 31일
  8. ^ 발레리 오로라 상대 시간 요약
  9. ^ http://www.mail-archive.com/mutt-users @mutt.http/msg24912.http: "쉘의 $MAIL 모니터는 atime에 의존하며 atime($MAIL) < mtime($MAIL)으로 새 이메일을 발음합니다."
  10. ^ "mount(2) - OpenBSD manual pages". openbsd.org. April 27, 2018. Retrieved September 26, 2018.
  11. ^ "Linux kernel 4.0, Section 1.5. 'lazytime' option for better update of file timestamps". kernelnewbies.org. May 1, 2015. Retrieved May 2, 2015.
  12. ^ Jonathan Corbet (November 19, 2014). "Introducing lazytime". LWN.net. Retrieved May 2, 2015.
  13. ^ "BSTJ version of C.ACM Unix paper".
  14. ^ "stat(2) - Linux manual page". man7.org. Retrieved February 27, 2015.
  15. ^ Andreas Jaeger (December 2, 2002), struct stat.h with nanosecond resolution, mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.
  16. ^ MSDN: 파일 시간

외부 링크