article thumbnail image
Published 2020. 11. 22. 17:11

[ 2020 2학기 / 8주차 ]

 

1. 파일 시스템

  1.1 파일 시스템 보기

$ df 파일시스템*
파일 시스템에 대한 디스크 사용 정보를 보여준다.

 

 

  1.2 디스크 사용량 보기

$ du [-s] 파일명*
파일 혹은 디렉터리의 사용량을 보여준다. 파일을 명시하지 않으면 현재 디렉터리 내 의 모든 파일들의 사용 공간을 보여준다.

 

 

  1.3 파일 시스템 구조

파일 시스템 구조

 

 

2. 파일 상태 정보와 i노드

  2.1 파일 상태

파일에 대한 모든 정보

    블록수, 파일 타입, 사용 권한, 링크수, 파일 소유자의 사용자 ID, 그룹 ID, 파일 크기, 최종 수정 시간 등

 

예)

$ ls -ls hello.c

          -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
복사했습니다!