3 파일과 디렉토리
학습목표 유닉스 파일의 특징을 이해한다. 파일에 관한 정보를 검색하는 함수를 사용할 수 있다. 하드 링크와 심볼릭 링크 파일을 이해하고 관련 함수를 사용할 수 있다. 파일 사용권한을 검색하고 조정하는 함수를 사용할 수 있다. 디렉토리의 특징을 이해한다. 디렉토리의 내용을 검색하는 함수를 사용할 수 있다. 디렉토리를 생성하고 삭제하는 함수를 사용할 수 있다.
목차 유닉스 파일의 특징 파일 정보 검색 파일의 종류 및 접근권한 검색 하드링크 및 심볼릭 링크 생성 디렉토리 관련 함수
유닉스 파일의 특징[1] 파일 파일의 종류 일반파일 장치파일 디렉토리 유닉스에서 파일은 데이터 저장, 장치구동, 프로세스 간 통신 등에 사용 파일의 종류 일반파일, 디렉토리, 특수파일 일반파일 텍스트 파일, 실행파일, 라이브러리, 이미지 등 유닉스에서 사용하는 대부분의 파일 편집기나 다른 응용 프로그램을 통해 생성 장치파일 장치를 사용하기 위한 특수 파일 블록장치파일 : 블록단위(8KB)로 읽고 쓴다. 문자장치파일 : 섹터단위(512바이트)로 읽고 쓴다 -> 로우디바이스(Raw Device) 예 : /devices 디렉토리 디렉토리도 파일로 취급 디렉토리와 관련된 데이터 블록은 해당 디렉토리에 속한 파일의 목록과 inode 저장
유닉스 파일의 특징[1]
유닉스 파일의 특징[2] 파일의 종류 구분 ls –l 명령으로 파일의 종류 확인 가능 : 결과의 맨 앞글자로 구분 파일 종류 식별 문자 예제 # ls -l /usr/bin/vi -r-xr-xr-x 5 root bin 193968 2007 9월 14일 /usr/bin/vi # ls -l / lrwxrwxrwx 1 root root 9 7월 16일 15:22 bin -> ./usr/bin drwxr-xr-x 42 root sys 1024 8월 5일 03:26 usr ...... # ls -lL /dev/dsk/c0d0s0 brw-r----- 1 root sys 102, 0 8월 3일 10:59 /dev/dsk/c0d0s0 # ls -lL /dev/rdsk/c0d0s0 crw-r----- 1 root sys 102, 0 8월 3일 12:12 /dev/rdsk/c0d0s0
유닉스 파일의 특징[3] 파일의 구성 요소 파일명 inode 데이터 블록 파일명, inode, 데이터블록 사용자가 파일에 접근할 때 사용 파일명과 관련된 inode가 반드시 있어야 함 파일명은 최대 255자까지 가능 파일명에서 대소문자를 구분하며, ‘.’으로 시작하면 숨김 파일 inode 외부적으로는 번호로 표시하며 내부적으로는 두 부분으로 나누어 정보 저장 파일 정보를 저장하는 부분 데이터 블록의 주소 저장하는 부분 파일의 inode 번호는 ls –i 명령으로 확인 가능 데이터 블록 실제로 데이터가 저장되는 부분
파일 정보 검색[1] 파일명으로 파일 정보 검색 : stat(2) #include <fcntl.h> inode에 저장된 파일 정보 검색 path에 검색할 파일의 경로를 지정하고, 검색한 정보를 buf에 저장 stat 구조체 #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int stat(const char *restrict path, struct stat *buf); struct stat { dev_t st_dev; ino_t st_ino; mode_t st_mode; nlink_t st_nlink; uid_t st_uid; gid_t st_gid; dev_t st_rdev; off_t st_size; time_t st_atime; time_t st_mtime; time_t st_ctime; blksize_t st_blksize; blkcnt_t st_blocks; char st_fstype[_ST_FSTYPSZ]; };
[예제 3-1] 파일명으로 inode 정보 검색하기 ex3_1.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <stdio.h> 04 05 int main(void) { 06 struct stat buf; 07 08 stat("unix.txt", &buf); 09 10 printf("Inode = %d\n", (int)buf.st_ino); 11 printf("Mode = %o\n", (unsigned int)buf.st_mode); 12 printf("Nlink = %o\n",(unsigned int) buf.st_nlink); 13 printf("UID = %d\n", (int)buf.st_uid); 14 printf("GID = %d\n", (int)buf.st_gid); 15 printf("SIZE = %d\n", (int)buf.st_size); 16 printf("Atime = %d\n", (int)buf.st_atime); 17 printf("Mtime = %d\n", (int)buf.st_mtime); 18 printf("Ctime = %d\n", (int)buf.st_ctime); 19 printf("Blksize = %d\n", (int)buf.st_blksize); 20 printf("Blocks = %d\n", (int)buf.st_blocks); 21 printf("FStype = %s\n", buf.st_fstype); 22 23 return 0; 24 } # ex3_1.out Inode = 192 Mode = 100644 Nlink = 1 UID = 0 GID = 1 SIZE = 24 Atime = 1231397228 Mtime = 1231397228 Ctime = 1231397228 Blksize = 8192 Blocks = 2 FStype = ufs
파일 기술자로 파일 정보 검색 : fstat(2) 파일 정보 검색[2] 파일 기술자로 파일 정보 검색 : fstat(2) fd로 지정한 파일의 정보를 검색하여 buf에 저장 #include <sys/types.h> #include <sys/stat.h> int fstat(int fd, struct stat *buf); 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <stdio.h> 04 05 int main(void) { 06 struct stat buf; 07 08 stat("unix.txt", &buf); 09 10 printf("Inode = %d\n", (int)buf.st_ino); 11 printf("Mode = %o\n", (unsigned int)buf.st_mode); 12 printf("Nlink = %o\n",(unsigned int) buf.st_nlink); 13 printf("UID = %d\n", (int)buf.st_uid); [예제 3-2] 명령행 인자 출력하기 ex3_2.c
[예제 3-2] fstat으로 파일 정보 검색하기 ex3_2.c 14 printf("GID = %d\n", (int)buf.st_gid); 15 printf("SIZE = %d\n", (int)buf.st_size); 16 printf("Atime = %d\n", (int)buf.st_atime); 17 printf("Mtime = %d\n", (int)buf.st_mtime); 18 printf("Ctime = %d\n", (int)buf.st_ctime); 19 printf("Blksize = %d\n", (int)buf.st_blksize); 20 printf("Blocks = %d\n", (int)buf.st_blocks); 21 printf("FStype = %s\n", buf.st_fstype); 22 23 return 0; 24 } # ex3_2.out Inode = 192 UID = 0
파일 접근권한 제어 stat 구조체의 st_mode 항목에 파일의 종류와 접근권한 정보저장 st_mode 값의 구조
파일 종류 검색[1] 상수를 이용한 파일 종류 검색 파일의 종류 검색 관련 상수 st_mode 값과 상수값을 AND(&) 연산하면 파일의 종류 부분만 남게 된다.
[예제 3-3] 상수를 이용해 파일 종류 검색하기 ex3_3.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <stdio.h> 04 05 int main(void) { 06 struct stat buf; 07 int kind; 08 09 stat("unix.txt", &buf); 10 11 printf("Mode = %o (16진수: %x)\n", (unsigned int)buf.st_mode, (unsigned int)buf.st_mode); 12 13 kind = buf.st_mode & S_IFMT; 14 printf("Kind = %x\n", kind); 15 16 switch (kind) { 17 case S_IFIFO: 18 printf("unix.txt : FIFO\n"); 19 break; 20 case S_IFDIR: 21 printf("unix.txt : Directory\n"); 22 break;
[예제 3-3] 상수를 이용해 파일 종류 검색하기 # ex3_3.out Mode = 100644 (16진수: 81a4) 23 case S_IFREG: 24 printf("unix.txt : Regular File\n"); 25 break; 26 } 27 28 return 0; 29 } # ex3_3.out Mode = 100644 (16진수: 81a4) Kind = 8000 unix.txt : Regular File
파일 종류 검색[2] 매크로를 이용한 파일 종류 검색 각 매크로는 인자로 받은 mode 값을 0xF000과 AND연산 수행 이 매크로는 POSIX 표준
[예제 3-4] 매크로를 이용해 파일 종류 검색하기 ex3_4.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <stdio.h> 04 05 int main(void) { 06 struct stat buf; 07 08 stat("unix.txt", &buf); 09 printf("Mode = %o (16진수: %x)\n",(unsigned int)buf.st_mode, (unsigned int)buf.st_mode); 11 12 if(S_ISFIFO(buf.st_mode)) printf("unix.txt : FIFO\n"); 13 if(S_ISDIR(buf.st_mode)) printf("unix.txt : Directory\n"); 14 if(S_ISREG(buf.st_mode)) printf("unix.txt : Regualr File\n"); 15 16 return 0; 17 } # ex3_4.out Mode = 100644 (16진수: 81a4) unix.txt : Regular File
파일 접근 권한 검색[1] 상수를 이용한 파일 접근 권한 검색 소유자의 접근권한 추출과 관련된 상수만 정의 소유자 외 그룹과 기타사용자의 접근권한은? st_mode의 값을 왼쪽으로 3비트 이동시키거나 상수값을 오른쪽으로 3비트 이동시켜 AND 수행 st_mode & (S_IREAD >> 3)
시프트 연산없이 직접 AND 연산이 가능한 상수 정의 파일 접근 권한 검색[2] POSIX에서 정의한 접근권한 검색 관련 상수 시프트 연산없이 직접 AND 연산이 가능한 상수 정의
[예제 3-5] 상수를 이용해 파일 접근 권한 검색하기 ex3_5.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <stdio.h> 04 05 int main(void) { 06 struct stat buf; 07 08 stat("unix.txt", &buf); 09 printf("Mode = %o (16진수: %x)\n", (unsigned int)buf.st_mode, (unsigned int)buf.st_mode); 10 11 if ((buf.st_mode & S_IREAD) != 0) 12 printf("unix.txt : user has a read permission\n"); 13 14 if ((buf.st_mode & (S_IREAD >> 3)) != 0) 15 printf("unix.txt : group has a read permission\n"); 16 17 if ((buf.st_mode & S_IROTH) != 0) 18 printf("unix.txt : other have a read permission\n"); 19 20 return 0; 21 } # ex3_5.out Mode = 100644 (16진수: 81a4) unix.txt : user has a read permission unix.txt : group has a read permission unix.txt : other have a read permission
함수를 사용한 파일 접근 권한 검색 : access(2) 파일 접근 권한 검색[3] 함수를 사용한 파일 접근 권한 검색 : access(2) path에 지정된 파일이 amode로 지정한 권한을 가졌는지 확인하고 리턴 접근권한이 있으면 0을, 오류가 있으면 -1을 리턴 오류메시지 ENOENT : 파일이 없음 EACCESS : 접근권한이 없음 amode 값 R_OK : 읽기 권한 확인 W_OK : 쓰기 권한 확인 X_OK : 실행 권한 확인 F_OK : 파일이 존재하는지 확인 #include <unistd.h> int access(const char *path, int amode);
[예제 3-6] access 함수를 이용해 접근 권한 검색하기 ex3_6.c 01 #include <sys/errno.h> 02 #include <unistd.h> 03 #include <stdio.h> 04 05 extern int errno; 06 07 int main(void) { 08 int per; 09 10 if (access("unix.bak", F_OK) == -1 && errno == ENOENT) 11 printf("unix.bak: File not exist.\n"); 12 13 per = access("unix.txt", R_OK); 14 if (per == 0) 15 printf("unix.txt: Read permission is permitted.\n"); 16 else if (per == -1 && errno == EACCES) 17 printf("unix.txt: Read permission is not permitted.\n"); 18 19 return 0; 20 } # ls -l unix* -rw-r--r-- 1 root other 24 1월 8일 15:47 unix.txt # ex3_6.out unix.bak: File not exist. unix.txt: Read permission is permitted.
파일 기술자로 접근 권한 변경 : fchmod(2) 파일 접근권한 변경 파일명으로 접근권한 변경 : chmod(2) path에 지정한 파일의 접근권한을 mode값에 따라 변경 접근권한을 더할 때는 OR연산자를, 뺄 때는 NOT연산 후 AND 연산자 사용 chmod(path, S_ORWXU); chmod(path, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH); mode |= S_IWGRP; mode &= ~(S_IROTH); 파일 기술자로 접근 권한 변경 : fchmod(2) #include <sys/types.h> #include <sys/stat.h> int chmod(const char *path, mode_t mode); mode 값 설정 후 chmod(path, mode) 잊지말기! #include <sys/types.h> #include <sys/stat.h> int fchmod(int fd, mode_t mode);
[예제 3-7] chmod 함수 사용하기 01 #include <sys/types.h> ex3_7.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <stdio.h> 04 05 int main(void) { 06 struct stat buf; 07 08 chmod("unix.txt", S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH); 09 stat("unix.txt", &buf); 10 printf("1.Mode = %o\n", (unsigned int)buf.st_mode); 11 12 buf.st_mode |= S_IWGRP; 13 buf.st_mode &= ~(S_IROTH); 14 chmod("unix.txt", buf.st_mode); 15 stat("unix.txt", &buf); 16 printf("2.Mode = %o\n", (unsigned int)buf.st_mode); 17 18 return 0; 19 } mode값에 따라 권한이 어떻게 바뀌었나? # ls -l unix.txt -rw-r--r-- 1 root other 24 1월 8일 15:47 unix.txt # ex3_7.out 1.Mode = 100754 2.Mode = 100770 -rwxrwx--- 1 root other 24 1월 8일 15:47 unix.txt
링크 파일 생성[1] 링크 하드링크 생성 : link(2) 이미 있는 파일이나 디렉토리에 접근할 수 있는 새로운 이름 같은 파일/디렉토리지만 여러 이름으로 접근할 수 있게 한다 하드링크 : 기존 파일과 동일한 inode 사용, inode에 저장된 링크 개수 증가 심볼릭 링크 : 기존 파일에 접근하는 다른 파일 생성(다른 inode 사용) 하드링크 생성 : link(2) 두 경로는 같은 파일시스템에 존재해야 함 #include <unistd.h> int link(const char *existing, const char *new);
[예제 3-8] link 함수 사용하기 01 #include <sys/types.h> ex3_8.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <unistd.h> 04 #include <stdio.h> 05 06 int main(void) { 07 struct stat buf; 08 09 stat("unix.txt", &buf); 10 printf("Before Link Count = %d\n", (int)buf.st_nlink); 11 12 link("unix.txt", "unix.ln"); 13 14 stat("unix.txt", &buf); 15 printf("After Link Count = %d\n", (int)buf.st_nlink); 16 17 return 0; 18 } # ls -l unix* -rwxrwx--- 1 root other 24 1월 8일 15:47 unix.txt # ex3_8.out Before Link Count = 1 After Link Count = 2 -rwxrwx--- 2 root other 24 1월 8일 15:47 unix.ln -rwxrwx--- 2 root other 24 1월 8일 15:47 unix.txt
링크 파일 생성[2] 심볼릭 링크 생성 : symlink(2) #include <unistd.h> int symlink(const char *name1, const char *name2); 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <unistd.h> 04 05 int main(void) { 06 symlink("unix.txt", "unix.sym"); 07 08 return 0; 09 } [예제 3-9] symlink 함수 사용하기 ex3_9.c # ls -l unix* -rwxrwx--- 2 root other 24 1월 8일 15:47 unix.ln -rwxrwx--- 2 root other 24 1월 8일 15:47 unix.txt # ex3_9.out lrwxrwxrwx 1 root other 8 1월 11일 18:48 unix.sym -> unix.txt
심볼릭 링크의 내용 읽기 : readlink(2) 심볼릭 링크 정보 검색 심볼릭 링크 정보 검색 : lstat(2) lstat : 심볼릭 링크 자체의 파일 정보 검색 심볼릭 링크를 stat 함수로 검색하면 원본 파일에 대한 정보가 검색된다. 심볼릭 링크의 내용 읽기 : readlink(2) 심볼릭 링크의 데이터 블록에 저장된 내용 읽기 원본 파일의 경로 읽기 : realpath(3) 심볼릭 링크가 가리키는 원본 파일의 실제 경로명 출력 #include <sys/types.h> #include <sys/stat.h> int lstat(const char *path, struct stat *buf); #include <unistd.h> ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsiz); #include <stdlib.h> char *realpath(const char *restrict file_name, char *restrict resolved_name);
[예제 3-10] lstat 함수 사용하기 01 #include <sys/types.h> ex3_10.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <unistd.h> 04 #include <stdio.h> 05 06 int main(void) { 07 struct stat buf; 08 09 printf("1. stat : unix.txt ---\n"); 10 stat("unix.txt", &buf); 11 printf("unix.txt : Link Count = %d\n", (int)buf.st_nlink); 12 printf("unix.txt : Inode = %d\n", (int)buf.st_ino); 13 14 printf("2. stat : unix.sym ---\n"); 15 stat("unix.sym", &buf); 16 printf("unix.sym : Link Count = %d\n", (int)buf.st_nlink); 17 printf("unix.sym : Inode = %d\n", (int)buf.st_ino); 18 19 printf("3. lstat : unix.sym ---\n"); 20 lstat("unix.sym", &buf);
[예제 3-10] lstat 함수 사용하기 21 printf("unix.sym : Link Count = %d\n", (int)buf.st_nlink); 22 printf("unix.sym : Inode = %d\n", (int)buf.st_ino); 23 24 return 0; 25 } # ls -li unix* 192 -rwxrwx--- 2 root other 24 1월 8일 15:47 unix.ln 202 lrwxrwxrwx 1 root other 8 1월 11일 18:48 unix.sym->unix.txt 192 -rwxrwx--- 2 root other 24 1월 8일 15:47 unix.txt # ex3_10.out 1. stat : unix.txt --- unix.txt : Link Count = 2 unix.txt : Inode = 192 2. stat : unix.sym --- unix.sym : Link Count = 2 unix.sym : Inode = 192 3. lstat : unix.sym --- unix.sym : Link Count = 1 unix.sym : Inode = 202
[예제 3-11] readlink 함수 사용하기 ex3_11.c 01 #include <sys/stat.h> 02 #include <unistd.h> 03 #include <stdlib.h> 04 #include <stdio.h> 05 06 int main(void) { 07 char buf[BUFSIZ]; 08 int n; 09 10 n = readlink("unix.sym", buf, BUFSIZ); 11 if (n == -1) { 12 perror("readlink"); 13 exit(1); 14 } 15 16 buf[n] = '\0'; 17 printf("unix.sym : READLINK = %s\n", buf); 18 19 return 0; 20 } # ex3_11.out unix.sym : READLINK = unix.txt # ls -l unix.sym lrwxrwxrwx 1 root other 8 1월 11일 18:48 unix.sym ->unix.txt
[예제 3-12] realpath 함수 사용하기 01 #include <sys/stat.h> ex3_12.c 01 #include <sys/stat.h> 02 #include <stdlib.h> 03 #include <stdio.h> 04 05 int main(void) { 06 char buf[BUFSIZ]; 07 08 realpath("unix.sym", buf); 09 printf("unix.sym : REALPATH = %s\n", buf); 10 11 return 0; 12 } # ex3_12.out unix.sym : REALPATH = /export/home/jw/syspro/ch3/unix.txt
디렉토리 관련 함수[1] 디렉토리 생성: mkdir(2) 디렉토리 삭제: rmdir(2) 디렉토리명 변경: rename(2) path에 지정한 디렉토리를 mode 권한에 따라 생성한다. 디렉토리 삭제: rmdir(2) 디렉토리명 변경: rename(2) #include <sys/types.h> #include <sys/stat.h> int mkdir(const char *path, mode_t mode); #include <unistd.h> int rmdir(const char *path); #include <stdio.h> int rename(const char *old, const char *new);
[예제 3-13] 디렉토리 생성/삭제/이름 변경하기 ex3_13.c 01 #include <sys/stat.h> 02 #include <unistd.h> 03 #include <stdlib.h> 04 #include <stdio.h> 05 06 int main(void) { 07 if (mkdir("han", 0755) == -1) { 08 perror("han"); 09 exit(1); 10 } 11 12 if (mkdir("bit", 0755) == -1) { 13 perror("bit"); 14 exit(1); 15 } 16 17 if (rename("han", "hanbit") == -1) { 18 perror("hanbit"); 19 exit(1); } 21 han -> hanbit로 변경
[예제 3-13] 디렉토리 생성/삭제/이름 변경하기 22 if (rmdir("bit") == -1) { 23 perror("bit"); 24 exit(1); 25 } 26 27 return 0; 28 } # ex3_13.out # ls -l drwxr-xr-x 2 root other 512 1월 12일 18:06 hanbit bit는 생성했다 삭제
디렉토리 관련 함수[2] 현재 작업 디렉토리 위치 : getcwd(3) 디렉토리 이동: chdir(2) 현재 작업 디렉토리 위치를 알려주는 명령은 pwd, 함수는 getcwd 디렉토리 이동: chdir(2) #include <unistd.h> char *getcwd(char *buf, size_t size); #include <unistd.h> int chdir(const char *path);
[예제 3-14] 작업 디렉토리 위치 검색/디렉토리 이동하기 ex3_14.c 01 #include <unistd.h> 02 #include <stdio.h> 03 04 int main(void) { 05 char *cwd; 06 char wd[BUFSIZ]; 07 08 cwd = getcwd(NULL, BUFSIZ); 09 printf("1.Current Directory : %s\n", cwd); 10 11 chdir("hanbit"); 12 13 getcwd(wd, BUFSIZ); 14 printf("2.Current Directory : %s\n", wd); 15 16 return 0; 17 } # ex3_14.out 1.Current Directory : /export/home/jw/syspro/ch3 2.Current Directory : /export/home/jw/syspro/ch3/hanbit
디렉토리 정보 검색[1] 디렉토리 열기: opendir(3) 디렉토리 닫기: closedir(3) 디렉토리 정보 읽기: readdir(3) 디렉토리의 내용을 한 번에 하나씩 읽어옴 #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *dirname); #include <sys/types.h> #include <dirent.h> int closedir(DIR *dirp); #include <sys/types.h> #include <dirent.h> struct dirent *readdir(DIR *dirp); typedef struct dirent { ino_t d_ino; off_t d_off; unsigned short d_reclen; char d_name[1]; } dirent_t;
[예제 3-15] 디렉토리 열고 정보 읽기 01 #include <dirent.h> ex3_15.c 01 #include <dirent.h> 02 #include <stdlib.h> 03 #include <stdio.h> 04 05 int main(void) { 06 DIR *dp; 07 struct dirent *dent; 08 09 if ((dp = opendir("hanbit")) == NULL) { 10 perror("opendir: hanbit"); 11 exit(1); 12 } 13 14 while ((dent = readdir(dp))) { 15 printf("Name : %s ", dent->d_name); 16 printf("Inode : %d\n", (int)dent->d_ino); 17 } 18 19 closedir(dp); 20 21 return 0; 22 } # ex3_15.out Name : . Inode : 208 Name : .. Inode : 189
[예제 3-16] 디렉토리 항목의 상세 정보 검색하기 ex3_16.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <dirent.h> 04 #include <stdlib.h> 05 #include <stdio.h> 06 07 int main(void) { 08 DIR *dp; 09 struct dirent *dent; 10 struct stat sbuf; 11 char path[BUFSIZ]; 12 13 if ((dp = opendir("hanbit")) == NULL) { 14 perror("opendir: hanbit"); 15 exit(1); } 18 while ((dent = readdir(dp))) { 19 if (dent->d_name[0] == '.') continue; 20 else break; 21 } 22
[예제 3-16] 디렉토리 항목의 상세 정보 검색하기 23 sprintf(path, "hanbit/%s", dent->d_name); 24 stat(path, &sbuf); 25 26 printf("Name : %s\n", dent->d_name); 27 printf("Inode(dirent) : %d\n", (int)dent->d_ino); 28 printf("Inode(stat) : %d\n", (int)sbuf.st_ino); 29 printf("Mode : %o\n", (unsigned int)sbuf.st_mode); 30 printf("Uid : %d\n", (int)sbuf.st_uid); 31 32 closedir(dp); 33 34 return 0; 35 } # ls -ai hanbit 208 . 189 .. 213 han.c # ex3_16.out Name : han.c Inode(dirent) : 213 Inode(stat) : 213 Mode : 100644 Uid : 0 디렉토리의 항목을 읽고 다시 stat 함수로 상세 정보 검색
디렉토리 오프셋: telldir(3), seekdir(3), rewinddir(3) 디렉토리 정보 검색[2] 디렉토리 오프셋: telldir(3), seekdir(3), rewinddir(3) telldir : 디렉토리 오프셋의 현재 위치를 알려준다. seekdir : 디렉토리 오프셋을 loc에 지정한 위치로 이동시킨다. rewinddir : 디렉토리 오프셋을 디렉토의 시작인 0으로 이동시킨다. #include <dirent.h> long telldir(DIR *dirp); void seekdir(DIR *dirp, long loc); void rewinddir(DIR *dirp);
[예제 3-17] 디렉토리 오프셋 변화 확인하기 01 #include <sys/stat.h> ex3_17.c 01 #include <sys/stat.h> 02 #include <dirent.h> 03 #include <stdlib.h> 04 #include <stdio.h> 05 06 int main(void) { 07 DIR *dp; 08 struct dirent *dent; 09 10 if ((dp = opendir("hanbit")) == NULL) { 11 perror("opendir"); 12 exit(1); } 15 printf("** Directory content **\n"); 16 printf("Start Offset : %ld\n", telldir(dp)); 17 while ((dent = readdir(dp))) { 18 printf("Read : %s ", dent->d_name); 19 printf("Cur Offset : %ld\n", telldir(dp)); 22 printf("** Directory Pointer Rewind **\n"); 23 rewinddir(dp); 24 printf("Cur Offset : %ld\n", telldir(dp));
[예제 3-17] 디렉토리 오프셋 변화 확인하기 25 26 printf("** Move Directory Pointer **\n"); 27 seekdir(dp, 24); 28 printf("Cur Offset : %ld\n", telldir(dp)); 29 30 dent = readdir(dp); 31 printf("Read %s ", dent->d_name); 32 printf("Next Offset : %ld\n", telldir(dp)); 33 34 closedir(dp); 35 return(0); 36 37 } # ex3_17.out ** Directory content Start Offset : 0 Read : . Cur Offset : 12 Read : .. Cur Offset : 24 Read : han.c Cur Offset : 512 ** Directory Pointer Rewind ** Cur Offset : 0 ** Move Directory Pointer ** Read han.c Next Offset : 512