링크 파일 생성[1] 링크 하드링크 생성 : link(2) 이미 있는 파일이나 디렉토리에 접근할 수 있는 새로운 이름

Slides:



Advertisements
Similar presentations
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Advertisements

1.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
6 레이스 컨디션.
1장. 이것이 C 언어다.. 1장. 이것이 C 언어다. 1-1 C 언어의 개론적 이야기 프로그래밍 언어란 무엇인가? 컴파일이란 무엇인가? 사람과 컴파일러가 이해할 수 있는 약속된 형태의 언어 C 언어도 프로그래밍 언어 중 하나이다. 컴파일이란 무엇인가? 프로그래밍.
Chapter 3 /etc/passwd real uid(진짜 사용자 식별번호), real gid(진짜 그룹 식별번호)
파일 시스템 및 디렉토리 ©숙대 창병모.
쉽게 풀어쓴 C언어 Express 제13장 구조체 C Express Slide 1 (of 25)
제2부 시스템 프로그래밍 파일 및 입출력 2011 가을 숙명여대 창병모 © 숙대 창병모.
Department of Computer Engineering
공유 메모리[1] 공유 메모리 공유 메모리 생성: shmget(2) 같은 메모리 공간을 두 개 이상의 프로세스가 공유하는 것
디바이스 드라이버 기초 디바이스 드라이버의 개요 파일 연산 디바이스 드라이버 등록 디바이스 드라이버 구성
디바이스 드라이버 개요 가상 디바이스드라이버 실습
1 유닉스 시스템 프로그래밍 개요.
C 10장. 함수의 활용 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
C 11장. 포인터의 활용 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
Network Lab. Seoung Hyeon, Lee
5장 파일 시스템.
6 프로세스 생성과 실행.
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
HW#1 Source 파일 제출 3.20(수)까지 제출 학번_이름_01.c
head data link data link data link NULL a b c
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
FND (Flexible Numeric Display)
10장 메모리 관리.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
Department of Computer Engineering
C 9장. 구조체 #include <stdio.h> int main(void) { int num;
fork로 생성한 자식 프로세스에서 exec 함수군을 호출
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
10장 포인터와 문자열 포인터 기본 배열과 포인터 매개변수 전달방법 포인터와 문자열.
3 파일과 디렉토리.
Linux/UNIX Programming APUE (Files & Directories)
Linux/UNIX Programming APUE (Files & Directories)
Term Project Team Member
프로세스 생성[1] 프로그램 실행 : system(3) #include <stdlib.h>
파일 기술자 복사 파일 기술자 복사 : dup(2) 파일 기술자 복사 : dup2(3)
12장 파일처리와 매크로 파일 입출력 함수 문자 입출력 함수 라인 입출력 함수 불록 입출력 함수 매크로.
파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용
(ioctl, mmap, fsync&flush)
6장 파일 및 레코드 잠금.
11장 파일.
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
Department of Computer Engineering
파일 접근권한 제어 stat 구조체의 st_mode 항목에 파일의 종류와 접근권한 정보저장 st_mode 값의 구조.
14주차.
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
5 프로세스 정보.
adopted from KNK C Programming : A Modern Approach
2장 표준 입출력 표준 입출력 함수의 종류 형식화된 입출력 문자 입출력 문자열 입출력.
문자 디바이스 드라이버 임베디드 시스템.
Linux Programming Spring 2008
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
네트워크 프로그래밍의 이해 School of Electronics and Information.
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
3 파일과 디렉토리.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Stepper Motor 디바이스 드라이버
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
Telnet 을 활용한 Linux 메뉴얼 오두환.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
3장 파일 다루기 한빛미디어(주).
Presentation transcript:

링크 파일 생성[1] 링크 하드링크 생성 : link(2) 이미 있는 파일이나 디렉토리에 접근할 수 있는 새로운 이름 같은 파일/디렉토리지만 여러 이름으로 접근할 수 있게 한다 하드링크 : 기존 파일과 동일한 inode 사용, inode에 저장된 링크 개수 증가 심볼릭 링크 : 기존 파일에 접근하는 다른 파일 생성(다른 inode 사용) 하드링크 생성 : link(2) 두 경로는 같은 파일시스템에 존재해야 함 #include <unistd.h> int link(const char *existing, const char *new);

[예제 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) { 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 함수 사용하기 (1005test7.c) 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 함수 사용하기 (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) { 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 함수 사용하기 (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) { 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] 디렉토리 생성/삭제/이름 변경하기 (test1.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] 작업 디렉토리 위치 검색/디렉토리 이동하기 (test2.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] 디렉토리 열고 정보 읽기 (test3.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] 디렉토리 항목의 상세 정보 검색하기 (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) { 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

실습(p166) 연습문제 1 파일의 정보를 추출하는 프로그램을 작성하라. 정보를 알고 싶은 파일의 이름은 명령형 인자로 받는다. $./mystat a.c 파일명: a.c inode번호 : 250 파일의 종류 : 일반파일 접근권한 : rw-r—r— UID : 100 파일수정시간 : 12312545

실습(p166) 연습문제 4 디렉토리가 비어 있는지 확인한 후 메시지를 출력하고, 비어 있으면 해당 디렉토리를 삭제하는 프로그램을 작성하라 연습문제 8 현재 디렉토리에 있는 내용을 파일인지 디렉토리인지 구별해 출력하는 프로그램을 작성하라