통계 시스템 호출 Linux 자습서

Stat System Call Linux Tutorial



Linux 커널에서 제공하는 시스템 호출은 glibc를 통해 C 프로그래밍 언어로 노출됩니다. 시스템 호출이 사용되면 OS와 통신하고 반환 시 OS는 시스템 호출 함수(반환 값)에 반환되는 매개변수를 통해 사용자와 통신합니다.

통계 시스템 호출:

Stat 시스템 호출은 Linux에서 파일에 액세스한 시점을 확인하는 것과 같이 파일의 상태를 확인하기 위한 시스템 호출입니다. stat() 시스템 호출은 실제로 파일 속성을 반환합니다. inode의 파일 속성은 기본적으로 Stat() 함수에 의해 반환됩니다. inode는 파일의 메타데이터를 포함합니다. inode는 파일의 종류, 파일의 크기, 파일에 접근(수정, 삭제)한 시점인 타임스탬프, 파일의 경로, 사용자 ID 및 그룹 ID, 파일의 링크를 포함합니다. , 파일 내용의 물리적 주소.







inode에는 stat() 시스템 호출에 필요한 모든 데이터가 포함되어 있으며 inode 테이블에 저장되는 파일의 인덱스 번호라고 말할 수 있습니다. 파일을 생성할 때마다 해당 파일에 대한 inode 번호가 생성됩니다. stat 시스템 호출을 사용하여 시스템 테이블을 볼 수 있습니다.



C Stat 시스템 호출의 구문:

C 프로그래밍 언어에서 stat 시스템 호출을 사용하려면 다음 헤더 파일을 포함해야 합니다.



#포함하다

Stat은 파일의 상태를 가져오는 데 사용됩니다. C stat 시스템 호출의 구문은 모든 운영 체제에서 동일하지 않을 수 있습니다. Linux에서 stat 시스템 호출 구문은 다음과 같습니다.





정수상태(상수 *, 구조체상태*버프)

int에 있는 함수의 반환 유형은 함수가 성공적으로 실행되면 0이 반환되고 오류가 있으면 -1이 반환됩니다.

여기 const char *경로 파일의 이름을 지정합니다. 파일 경로가 심볼릭 링크인 경우 파일 이름 대신 링크를 지정해야 합니다.



그런 다음 함수에서 파일에 대한 데이터 또는 정보가 저장되는 stat 구조가 있습니다. 버프, 매개변수로 전달되고 호출 실행 중에 채워지며 호출 후 사용자가 읽을 수 있습니다.

통계 구조:

헤더 파일에 정의된 stat 구조는 다음 필드를 포함합니다.

구조체상태
{
mode_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_gid;
off_tst_size;
구조체팀 스펙 st_atim;
구조체팀 스펙 st_mtim;
구조체팀 스펙 st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};

설명:

  1. st_dev: 현재 파일이 있는 장치의 ID입니다.
  2. st_rdev: 이 필드는 특정 파일이 특정 장치를 나타낸다는 것을 설명합니다.
  3. st_ino: 파일의 inode 번호 또는 일련 번호입니다. 인덱스 번호이므로 모든 파일에 대해 고유해야 합니다.
  4. st_크기: st_size는 바이트 단위의 파일 크기입니다.
  5. st_atime: 파일에 액세스한 마지막 시간 또는 최근 시간입니다.
  6. st_ctime: 파일의 상태나 권한이 변경된 최근 시간입니다.
  7. st_mtime: 파일이 수정된 최근 시간입니다.
  8. st_blksize: 이 필드는 파일마다 다를 수 있는 I/O 파일 시스템의 기본 블록 크기를 제공합니다.
  9. st_blocks: 이 필드는 512바이트의 배수로 총 블록 수를 알려줍니다.
  10. st_n링크: 이 필드는 총 하드 링크 수를 알려줍니다.
  11. st_uid: 이 필드는 사용자 ID를 나타냅니다.
  12. st_gid: 이 필드는 그룹 ID를 나타냅니다.
  13. 표준 모드: 파일에 대한 권한을 나타내고 파일의 모드를 알려줍니다. 다음은 st_mode 필드에 대해 정의해야 하는 플래그입니다.
깃발 설명 플래그 값
S_IFMT 파일의 모드 값을 가져오는 데 사용되는 비트 마스크 0170000
S_IFSOCK 소켓의 파일 상수 0140000
S_IFLINK 심볼릭 링크의 파일 상수 0120000
S_IFREG 일반 파일의 파일 상수 0100000
S_IFBLK 블록 파일에 대한 파일 상수 0060000
S_IFDIR 디렉토리 파일에 대한 파일 상수 0040000
S_IFCHR 문자 파일에 대한 파일 상수 0020000
S_IFIFO fifo의 파일 상수 0010000
S_ISUID 사용자 ID 비트 설정 0004000
S_ISGID 그룹 ID 비트 설정 0002000
S_ISVTX 공유 텍스트를 나타내는 고정 비트 0001000
S_IRWXU 소유자 권한(읽기, 쓰기, 실행) 00700
S_IRUSR 소유자에 대한 읽기 권한 00400
S_IWUSR 소유자에 대한 쓰기 권한 00200
S_IXUSR 소유자에 대한 실행 권한 00100
S_IRWXG 그룹 권한(읽기, 쓰기, 실행) 00070
S_IRGRP 그룹에 대한 읽기 권한 00040
S_IWGRP 그룹에 대한 쓰기 권한 00020
S_IXGRP 그룹에 대한 실행 권한 00010
S_IRWXO 다른 사람에 대한 권한(읽기, 쓰기, 실행) 00007
S_IROTH 다른 사람에 대한 읽기 권한 00004
S_IWOTH 다른 사람에 대한 쓰기 권한 00002
S_IXOTH 다른 사람에 대한 실행 권한 00001

통계 시스템 호출을 사용하는 방법:

다음 예제는 Linux, Ubuntu에서 C 프로그래밍 언어로 stat 시스템 호출을 사용하는 방법을 보여줍니다.

실시예 1:

다음 코드에서 우리는 파일의 모드를 찾을 것입니다:

암호:

#포함하다
#포함하다
정수기본()
{
//stat 구조체에 대한 포인터
구조체상태 파일;

//stat 시스템 호출
상태('stat.c', &파일);

// st_mode에 접근(stat 구조체의 데이터 멤버)
인쇄 ('st_mode = %o',파일.st_mode);
반품 0;
}

프로그램을 컴파일하고 실행하면 아래와 같이 반환됩니다.

이 코드에서는 stat 시스템 호출에서 파일 이름을 전달한 다음 sfile인 stat 구조체에 대한 포인터를 전달했습니다. 그런 다음 stat 구조체에 대한 포인터를 사용하여 printf 문을 사용하여 파일의 모드를 표시하는 st_mode에 액세스합니다.

헤더 파일을 사용하여 stat 시스템 호출을 사용할 수 있습니다. 헤더 파일은 표준 입출력 라이브러리 파일이므로 C 코드에서 printf 또는 scanf를 사용할 수 있습니다.

실시예 2:

다음 코드에서는 stat 시스템 호출을 사용하여 파일에 대한 정보를 얻을 것입니다.

암호:

#포함하다
#포함하다
#포함하다
#포함하다

무효의파일( 상수파일 이름[]);

정수기본(){
ssize_t 읽기;
*완충기= 0;
size_tbuf_size= 0;

인쇄 ('확인할 파일의 이름을 입력하세요:N');
읽다=도착(&완충기, &buf_size,표준 입력);

만약 (읽다<=0 ){
인쇄 ('겟라인 실패N');
출구 (1);
}

만약 (완충기[읽다-1] == 'N'){
완충기[읽다-1] = 0;
}

정수NS=열려있는(완충기,O_RDONLY);
만약(NS== -1){
인쇄 ('파일이 존재하지 않습니다N');
출구 (1);
}
또 다른{
파일(완충기);
}
무료 (완충기);
반품 0;
}

무효의파일( 상수파일 이름[]){

구조체상태 파일;

만약(상태(파일 이름, &파일)== -1){
인쇄 ('오류가 발생했습니다N');
}

//stat 구조체의 데이터 멤버 접근
인쇄 ('N파일 st_uid %dN',파일.st_uid);
인쇄 ('N파일 st_blksize %ldN',파일.st_blksize);
인쇄 ('N파일 st_gid %dN',파일.st_gid);
인쇄 ('N파일 st_blocks %ldN',파일.st_blocks);
인쇄 ('N파일 st_size %ldN',파일.st_size);
인쇄 ('N파일 st_nlink% uN',(서명되지 않은 정수)파일.st_n링크);
인쇄 ('N파일 권한 사용자N');
인쇄 ((파일.st_mode &S_IRUSR)? 'NS':'-');
인쇄 ((파일.st_mode &S_IWUSR)? '에':'-');
인쇄 ((파일.st_mode &S_IXUSR)? 'NS':'-');
인쇄 ('N');
인쇄 ('N파일 권한 그룹N');
인쇄 ((파일.st_mode &S_IRGRP)? 'NS':'-');
인쇄 ((파일.st_mode &S_IWGRP)? '에':'-');
인쇄 ((파일.st_mode &S_IXGRP)? 'NS':'-');
인쇄 ('N');
인쇄 ('N파일 권한 기타N');
인쇄 ((파일.st_mode &S_IROTH)? 'NS':'-');
인쇄 ((파일.st_mode &S_IWOTH)? '에':'-');
인쇄 ((파일.st_mode &S_IXOTH)? 'NS':'-');
인쇄 ('N');
}

산출:

위의 C 코드에서는 파일 이름을 입력했는데 파일이 없으면 프로그램 실행이 중지됩니다. 이는 다음 이미지에 나와 있습니다.

파일이 존재하면 sfile(n) 함수가 호출되어 파일 이름을 전달합니다. 함수 내에서 먼저 Stat 시스템 호출을 사용했습니다. stat()이 -1을 반환하면 오류가 있어야 메시지가 인쇄되고 프로그램 실행이 중지됩니다.

그런 다음 printf 문에서 함수 이름과 점 구분 기호를 사용하여 데이터 멤버에 액세스했습니다. 통계 구조체 .

그런 다음 파일 모드에 대해 st_mode의 매크로 또는 플래그에 액세스했습니다. 여기서 논리 및 연산자는 각 모드를 인쇄하는 데 사용됩니다. 지정된 파일(사용자가 입력한 파일명)에 대해 사용자, 그룹 등의 권한을 확인했습니다.

이를 통해 C 프로그래밍 언어에서 stat 시스템 호출을 사용하여 OS 커널에서 파일에 대한 정보를 얻는 방법을 볼 수 있습니다. 질문이 있으시면 언제든지 댓글 섹션을 통해 알려주십시오.