[ 2020 2학기 / 8주차 ]
1. 파일 시스템
1.1 파일 시스템 보기
$ df 파일시스템*
파일 시스템에 대한 디스크 사용 정보를 보여준다.
1.2 디스크 사용량 보기
$ du [-s] 파일명*
파일 혹은 디렉터리의 사용량을 보여준다. 파일을 명시하지 않으면 현재 디렉터리 내 의 모든 파일들의 사용 공간을 보여준다.
1.3 파일 시스템 구조

2. 파일 상태 정보와 i노드
2.1 파일 상태
• 파일에 대한 모든 정보
블록수, 파일 타입, 사용 권한, 링크수, 파일 소유자의 사용자 ID, 그룹 ID, 파일 크기, 최종 수정 시간 등
예)
$ ls -ls hello.c
2 -rw-r--r-- 1 chang cs 617 11월 17일 15:53 hello.c
블록수 파일타입/사용권한 링크수 사용자ID 그룹ID 파일 크기 최종 수정 시간 파일이름/파일 타입
2.2 stat 명령어
$ stat [옵션] 파일
파일의 자세한 상태 정보를 출력한다.
2.3 i-노드
-한 파일은 하나의 i-노드를 갖는다.
| 파일 상태 정보 | 의미 |
| 파일 크기 | 파일의 크기(K 바이트 단위) |
| 파일 종류 | 파일 종류는 나타낸다. |
| 접근권한 | 파일에 대한 소유자, 그룹, 기타 사용자의 읽기/쓰기/실행 권한 |
| 하드 링크 수 | 파일에 대한 하드 링크 개수 |
| 소유자 및 그룹 | 파일 소유자 ID및 소유자가 속한 그룹 |
| 파일 크기 | 파일의 크기(바이트 단위) |
| 최종 접근 시간 | 파일을 최후로 접근한 시간 |
| 최종 수정 시간 | 파일을 생성 혹은 최후로 수정한 시간 |
| 데이터 블록 주소 | 실제 데이터가 저장된 데이터 블록의 주소 |
2.4 블록 포인터
• 데이터 블록에 대한 포인터
파일의 내용을 저장하기 위해 할당된 데이터 블록의 주소
• 하나의 i-노드 내의 블록 포인터
직접 블록 포인터 10개
간접 블록 포인터 1개
이중 간접 블록 포인터 1개
3. 디렉토리
3.1 디렉토리 구현
-파일 시스템 구조에서 디렉터리를 위한 구조는 따로 없다.
디렉터리도 일종의 파일로 다른 파일처럼 구현된다. 또 다른 파일처럼 하나의 i-노드로 표현된다. 디렉터리의 내용은 디렉터리 엔트리로 파일이름, i-노드 번호로 이루어져 있다.
4. 링크의 구현
4.1 링크
-링크는 기존 파일에 대한 또 하나의 새로운 이름이다. 링크의 종류에는 하드 링크와 심볼릭 링크가 있다.
$ ln [-s] 파일1 파일2
파일1에 대한 새로운 이름(링크)로 파일2를 만들어 준다. -s 옵션은 심볼릭 링크
$ ln [-s] 파일1 디렉터리
파일1에 대한 링크를 지정된 디렉터리에 같은 이름으로 만들어 준다.
4.2 하드 링크
- 기존 파일에 대한 새로운 이름이라고 생각할 수 있다.
- 실제로 기존 파일을 대표하는 i-노드를 가리켜 구현한다.
예)
$ ln hello.txt hi.txt
$ ls -l
-rw------- 2 chang cs 15 11월 7일 15:31 hello.txt
-rw------- 2 chang cs 15 11월 7일 15:31 hi.txt
$ ls -i hello.txt hi.txt
537384090 hello.txt 537384090 hi.txt
4.3 심볼릭 링크
- 다른 파일을 가리키고 있는 별도의 파일이다.
- 실제 파일의 경로명을 저장하고 있는 일종의 특수 파일이다.
- 이 경로명이 다른 파일에 대한 간접적인 포인터 역할을 한다.
예)
$ ln -s hello.txt hi.txt
$ ls -l
-rw------- 1 chang cs 15 11월 7일 15:31 hello.txt
lrwxrwxrwx 1 chang cs 9 1월 24일 12:56 hi.txt -> hello.txt
$ ln –s /usr/bin/gcc cc
$ ls –l cc
lrwxrwxrwx. 1 chang chang 12 7월 21 20:09 cc -> /usr/bin/gcc
5. 파일 입출력
5.1 C 언어의 파일 종류
① 텍스트 파일(text file)
- 사람들이 읽을 수 있는 문자들을 저장하고 있는 파일
- 텍스트 파일에서 “한 줄의 끝”을 나타내는 표현은 파일이 읽어 들여질 때, C 내부의 방식으로 변환된다.
② 이진 파일(binary file)
- 모든 데이터는 있는 그대로 바이트의 연속으로 저장
- 이진 파일을 이용하여 메모리에 저장된 변수 값 형태 그대로 파일에 저장 할 수 있다.
5.2 파일 입출력
① 파일 열기
파일을 사용하기 위해서는 반드시 먼저 파일 열기(fopen)를 해야 한다. 파일 열기를 하면 FILE 구초제에 대한 포인터가 리턴된다. FILE 포인터는 열린 파일을 지정한다.
- 함수 fopen()
FILE *fopen(const char *filename, const char *mode);
파일 열기를 한다. 열린 파일을 나타내는 FILE 포인터를 반환한다. 오류가 발생하면 NULL을 반환한다
- fopen(): 텍스트 파일 열기
| 모드 | 의미 | 파일이 없으면 | 파일이 있으면 |
| "r" | 읽기 전용(read) | NULL 반환 | 정상 동작 |
| "w" | 쓰기 전용(write) | 새로 생성 | 기존 내용 삭제 |
| "a" | 추가 쓰기(append) | 새로 생성 | 기존 내용 뒤에 추가 |
| "r+" | 읽기와 쓰기 | NULL 반환 | 정상 동작 |
| "w+" | 읽기와 쓰기 | 새로 생성 | 기존 내용 삭제 |
| "a+" | 추가를 위한 읽기와 쓰기 | 새로 생성 | 기존 내용 뒤에 추가 |
② 스트림과 FILE 구조체
• 스트림
파일이 열리면 스트림(stream)이라고 한다.
• FILE 구조체
stdio.h에 정의되어 있음.
열린 파일의 현재 상태를 나타내는 필드 변수들
특히 파일 입출력에 사용되는 버퍼 관련 변수들
- 표준 입출력 스트림
C 프로그램이 실행되면 자동적으로 열리고 프로그램이 종료될 때 자동으로 닫힘.
| 표준 입출력 스트림 | 설명 | 가리키는 장치 |
| stdin | 표준입력에 대한 FILE 포인터 | 키보드 |
| stdout | 표준출력에 대한 FILE 포인터 | 모니터 |
| stderr | 표준 오류에 대한 FILE 포인터 | 모니터 |
③ 파일 닫기
int fclose(FILE *fp );
fp가 가리키는 파일을 닫는다.
성공하면 0, 오류일 때는 -1을 반환한다.
④ 파일 입출력 함수
| 표준 입출력 함수 | 표준 파일 입출력 함수 | 기능 |
| getchar() | fgetc(), getc() | 문자단위로 입력하는 함수 |
| putchar() | fputc(), putc() | 문자단위로 출력하는 함수 |
| gets() | fgets() | 문자열을 입력하는 함수 |
| puts() | fputs() | 문자열을 출력하는 함수 |
| scanf() | fscanf() | 자료형에 따라 자료를 입력하는 함수 |
| printf() | fprintf() | 자료형에 따라 자료를 출력하는 함수 |
• int fgetc(FILE *fp);
getc 함수는 fp가 지정한 파일에서 한 문자를 읽어서 리턴한다.
파일 끝에 도달했을 경우에는 EOF(-1)를 리턴한다.
• int fputc(int c, FILE *fp);
putc 함수는 파일에 한 문자씩 출력하는 함수
리턴값으로 출력하는 문자 리턴
출력시 오류가 발생하면 EOF(-1) 리턴
<줄 단위 입출력>
• 파일로 한 줄씩 읽기
char* fgets(char *s, int n, FILE *fp);
파일로부터 한 줄을 읽어서 문자열 포인터 s에 저장하고 s를 리턴한다.
• 파일에 한 줄씩 쓰기
int fputs(const char *s, FILE *fp);
문자열 s를 fp가 나타내는 파일에 출력한다. 성공하면 출력한 바이트 수를, 실패하면 EOF 값을 리턴한다.
• cat.c
#include <stdio.h>
/* 텍스트 파일 내용을 표준출력에 프린트 */
int main(int argc, char *argv[])
{
FILE *fp;
int c;
if (argc < 2)
fp = stdin; // 명령줄 인수가 없으면 표준입력 사용
else fp = fopen(argv[1],"r"); // 읽기 전용으로 파일 열기
c = getc(fp); // 파일로부터 문자 읽기
while (c != EOF) { // 파일끝이 아니면
putc(c, stdout); // 읽은 문자를 표준출력에 출력
c = getc(fp); // 파일로부터 문자 읽기
}
fclose(fp);
return 0;
}
• copy.c
#include <stdio.h>
/* 파일 복사 프로그램 */
int main(int argc, char *argv[])
{
char c;
FILE *fp1, *fp2;
if (argc !=3) {
fprintf(stderr, "사용법:
%s 파일1 파일2\n", argv[0]);
return 1;
}
fp1 = fopen(argv[1], "r");
if (fp1 == NULL) {
fprintf(stderr, "파일 %s 열기
오류\n", argv[1]);
return 2;
}
fp2 = fopen(argv[2], "w");
while ((c = fgetc(fp1)) != EOF)
fputc(c, fp2);
fclose(fp1);
fclose(fp2);
return 0;
}
• line.c
#include <stdio.h>
#define MAXLINE 80
int main(int argc, char *argv[]) // 텍스트 파일에 줄 번호 붙여 프린트
{
FILE *fp;
int line = 0;
char buffer[MAXLINE];
…
if ( (fp = fopen(argv[1],"r")) == NULL) {
fprintf(stderr, "파일 열기 오류\n");
exit(2);
}
while (fgets(buffer, MAXLINE, fp) != NULL) { // 한 줄 읽기
line++;
printf("%3d %s", line, buffer); // 줄번호와 함께 프린트
}
exit(0);
}'Study > LINUX' 카테고리의 다른 글
| [2020-2 리눅스 이론] 9주차 (0) | 2020.11.28 |
|---|---|
| [2020-2 리눅스 실습] 8주차 (0) | 2020.11.22 |
| [2020-2 리눅스 실습] 7주차 (0) | 2020.11.14 |
| [2020-2 리눅스 이론] 7주차 (0) | 2020.11.14 |
| [2020-2 리눅스 이론] 6주차 (0) | 2020.11.08 |