Download presentation
Presentation is loading. Please wait.
Published byἹερώνυμος Βικελίδης Modified 6년 전
1
링크 파일 생성[1] 링크 하드링크 생성 : link(2) 이미 있는 파일이나 디렉토리에 접근할 수 있는 새로운 이름
같은 파일/디렉토리지만 여러 이름으로 접근할 수 있게 한다 하드링크 : 기존 파일과 동일한 inode 사용, inode에 저장된 링크 개수 증가 심볼릭 링크 : 기존 파일에 접근하는 다른 파일 생성(다른 inode 사용) 하드링크 생성 : link(2) 두 경로는 같은 파일시스템에 존재해야 함 #include <unistd.h> int link(const char *existing, const char *new);
2
[예제 3-8] link 함수 사용하기 (1005test6.c)
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) { struct stat buf; 08 stat("unix.txt", &buf); printf("Before Link Count = %d\n", (int)buf.st_nlink); 11 link("unix.txt", "unix.ln"); 13 stat("unix.txt", &buf); printf("After Link Count = %d\n", (int)buf.st_nlink); 16 return 0; 18 } # ls -l unix* -rwxrwx root other 월 8일 15:47 unix.txt # ex3_8.out Before Link Count = 1 After Link Count = 2 -rwxrwx root other 월 8일 15:47 unix.ln -rwxrwx root other 월 8일 15:47 unix.txt
3
링크 파일 생성[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) { symlink("unix.txt", "unix.sym"); 07 return 0; 09 } [예제 3-9] symlink 함수 사용하기 (1005test7.c) ex3_9.c # ls -l unix* -rwxrwx root other 월 8일 15:47 unix.ln -rwxrwx root other 월 8일 15:47 unix.txt # ex3_9.out lrwxrwxrwx 1 root other 월 11일 18:48 unix.sym -> unix.txt
4
심볼릭 링크의 내용 읽기 : 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);
5
[예제 3-10] lstat 함수 사용하기 (1005test8.c)
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) { struct stat buf; 08 printf("1. stat : unix.txt ---\n"); stat("unix.txt", &buf); printf("unix.txt : Link Count = %d\n", (int)buf.st_nlink); printf("unix.txt : Inode = %d\n", (int)buf.st_ino); 13 printf("2. stat : unix.sym ---\n"); stat("unix.sym", &buf); printf("unix.sym : Link Count = %d\n", (int)buf.st_nlink); printf("unix.sym : Inode = %d\n", (int)buf.st_ino); 18 printf("3. lstat : unix.sym ---\n"); lstat("unix.sym", &buf);
6
[예제 3-10] lstat 함수 사용하기 printf("unix.sym : Link Count = %d\n", (int)buf.st_nlink); printf("unix.sym : Inode = %d\n", (int)buf.st_ino); 23 return 0; 25 } # ls -li unix* 192 -rwxrwx root other 월 8일 15:47 unix.ln 202 lrwxrwxrwx 1 root other 월 11일 18:48 unix.sym->unix.txt 192 -rwxrwx root other 월 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
7
[예제 3-11] readlink 함수 사용하기 (1005test9.c)
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) { char buf[BUFSIZ]; int n; 09 n = readlink("unix.sym", buf, BUFSIZ); if (n == -1) { perror("readlink"); exit(1); } 15 buf[n] = '\0'; printf("unix.sym : READLINK = %s\n", buf); 18 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
8
[예제 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) { char buf[BUFSIZ]; 07 realpath("unix.sym", buf); printf("unix.sym : REALPATH = %s\n", buf); 10 return 0; 12 } # ex3_12.out unix.sym : REALPATH = /export/home/jw/syspro/ch3/unix.txt
9
디렉토리 관련 함수[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);
10
[예제 3-13] 디렉토리 생성/삭제/이름 변경하기 (test1.c)
01 #include <sys/stat.h> 02 #include <unistd.h> 03 #include <stdlib.h> 04 #include <stdio.h> 05 06 int main(void) { if (mkdir("han", 0755) == -1) { perror("han"); exit(1); } 11 if (mkdir("bit", 0755) == -1) { perror("bit"); exit(1); } 16 if (rename("han", "hanbit") == -1) { perror("hanbit"); exit(1); } 21 han -> hanbit로 변경
11
[예제 3-13] 디렉토리 생성/삭제/이름 변경하기
if (rmdir("bit") == -1) { perror("bit"); exit(1); } 26 return 0; 28 } # ex3_13.out # ls -l drwxr-xr-x 2 root other 월 12일 18:06 hanbit bit는 생성했다 삭제
12
디렉토리 관련 함수[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);
13
[예제 3-14] 작업 디렉토리 위치 검색/디렉토리 이동하기 (test2.c)
01 #include <unistd.h> 02 #include <stdio.h> 03 04 int main(void) { char *cwd; char wd[BUFSIZ]; 07 cwd = getcwd(NULL, BUFSIZ); printf("1.Current Directory : %s\n", cwd); 10 chdir("hanbit"); 12 getcwd(wd, BUFSIZ); printf("2.Current Directory : %s\n", wd); 15 return 0; 17 } # ex3_14.out 1.Current Directory : /export/home/jw/syspro/ch3 2.Current Directory : /export/home/jw/syspro/ch3/hanbit
14
디렉토리 정보 검색[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;
15
[예제 3-15] 디렉토리 열고 정보 읽기 (test3.c)
01 #include <dirent.h> 02 #include <stdlib.h> 03 #include <stdio.h> 04 05 int main(void) { DIR *dp; struct dirent *dent; 08 if ((dp = opendir("hanbit")) == NULL) { perror("opendir: hanbit"); exit(1); } 13 while ((dent = readdir(dp))) { printf("Name : %s ", dent->d_name); printf("Inode : %d\n", (int)dent->d_ino); } 18 closedir(dp); 20 return 0; 22 } # ex3_15.out Name : . Inode : 208 Name : .. Inode : 189
16
[예제 3-16] 디렉토리 항목의 상세 정보 검색하기 (test4.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) { DIR *dp; struct dirent *dent; struct stat sbuf; char path[BUFSIZ]; 12 if ((dp = opendir("hanbit")) == NULL) { perror("opendir: hanbit"); exit(1); } while ((dent = readdir(dp))) { if (dent->d_name[0] == '.') continue; else break; } 22
17
[예제 3-16] 디렉토리 항목의 상세 정보 검색하기
sprintf(path, "hanbit/%s", dent->d_name); stat(path, &sbuf); 25 printf("Name : %s\n", dent->d_name); printf("Inode(dirent) : %d\n", (int)dent->d_ino); printf("Inode(stat) : %d\n", (int)sbuf.st_ino); printf("Mode : %o\n", (unsigned int)sbuf.st_mode); printf("Uid : %d\n", (int)sbuf.st_uid); 31 32 closedir(dp); 33 34 return 0; 35 } # ls -ai hanbit han.c # ex3_16.out Name : han.c Inode(dirent) : 213 Inode(stat) : 213 Mode : Uid : 0 디렉토리의 항목을 읽고 다시 stat 함수로 상세 정보 검색
18
디렉토리 오프셋: 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);
19
[예제 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) { DIR *dp; struct dirent *dent; 09 if ((dp = opendir("hanbit")) == NULL) { perror("opendir"); exit(1); } printf("** Directory content **\n"); printf("Start Offset : %ld\n", telldir(dp)); while ((dent = readdir(dp))) { printf("Read : %s ", dent->d_name); printf("Cur Offset : %ld\n", telldir(dp)); printf("** Directory Pointer Rewind **\n"); rewinddir(dp); printf("Cur Offset : %ld\n", telldir(dp));
20
[예제 3-17] 디렉토리 오프셋 변화 확인하기 25 printf("** Move Directory Pointer **\n"); seekdir(dp, 24); 28 printf("Cur Offset : %ld\n", telldir(dp)); 29 dent = readdir(dp); printf("Read %s ", dent->d_name); printf("Next Offset : %ld\n", telldir(dp)); 33 closedir(dp); 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
21
실습(p166) 연습문제 1 파일의 정보를 추출하는 프로그램을 작성하라. 정보를 알고 싶은 파일의 이름은 명령형 인자로 받는다. $./mystat a.c 파일명: a.c inode번호 : 250 파일의 종류 : 일반파일 접근권한 : rw-r—r— UID : 100 파일수정시간 :
22
실습(p166) 연습문제 4 디렉토리가 비어 있는지 확인한 후 메시지를 출력하고, 비어 있으면 해당 디렉토리를 삭제하는 프로그램을 작성하라 연습문제 8 현재 디렉토리에 있는 내용을 파일인지 디렉토리인지 구별해 출력하는 프로그램을 작성하라
Similar presentations