01 리눅스의 기본 개념과 프로그램 작성

· 다중작업 : 선점 가능한(preemptive) 실제 다중 작업 지원

 - 작업 :  실행중인 상태의 프로그램(프로세스)

· 다중 사용자

- 동시에 여러 명의 사용자가 시스템에서 작업하는 것을 허용

- 터미널이나 네트워크 연결을 통해서 동일한 하나의 리눅스 시스템을 이용

· 다중 프로세서 : 리눅스는 다중 프로세서 구조에서도 실행 가능

- 다중 프로세서 : 2개 이상의 CPU로 구성된 컴퓨터 시스템

· 이식성이 높고 다양한 언어로 사용이 가능해 확장성이 좋음

· 파일 시스템

- 트리구조

- 별도로 추가된 물리적인 보조기억장치들이나 하드웨어 디바이스들도 파일형태로 파일시스템에 연동되어있음

· 권한

- 사용자별로 별도의 권한 부여

- 관리자 : 시스템을 관리하기 위해 막강한 권한을 갖음

- 사용자 : 여러 명의 사용자가 동시에 사용할 수 있기 때문에 발생할 수 있는 여러 가지 문제를 사전에 방지

· 셸

- 사용자가 시스템을 쉽게 사용할 수 있게 중간자 역할의 프로그램

- 프롬프트에 명령어 라인 입력해서 원하는 작업 수행 가능


· man 명령어 : 시스템의 명령이나 프로그래밍 언어의 함수 사용법을 익히기 위한 핵심

· cat 명령어 : 파일 내용을 화면에 표시(도스의 type과 유사)

· vi 편집기 : 편집모드→명령어모드→ESC→:→wq→Enter


★gcc를 별다른 옵션 없이 실행하면 생성되는 실행파일명은 항상 a.out

· 실행파일명을 변경하고 싶으면 - o 옵션을 사용하면 변경 가능

$ gcc [option] source_1.c [source_2.c source_3.c ... source_n.c]

[option]

- o filename(생성될 실행파일명)

- c (one.c) : 저장한 소스코드의 목적파일 만들 때


 [두 개 이상의 소스코드로 하나의 실행 파일 만들기]

 실행 파일을 만들기 위한 두 개의 소스코드 one.c와 two.c가 있음


 Q. 두 개의 파일을 동시에 컴파일하여 한 개의 실행파일인 three를 만들려고 한다. 컴파일하는 명령어를 쓰세요.

 A. $ gcc - o three one.c two.c


· make와 Makefile

- Makefile 파일

= 소스 코드, 목적 코드, 실행 코드들의 연관성을 나타내고, 이전 단계의 파일이 갱신되었을 때 다음 단계의 파일을 만들기 위한 명령어를 포함

= make 프로그램은 Makefile 파일에서 정한 연관성을 유지해 항상 최신의 소스코드에 부합하는 실행코드를 쉽게 만들수 있도록 함

= Makefile의 간단한 구조

target_list: dependency_list

command_list

 Q. three 실행파일이 만들어질 수 있도록 make 유틸리티를 실행할 수 있는 Makefile 파일의 내용을 쓰세요.

 A. three: one.c two.c

        gcc - o three one.c two.c


02 파일 시스템

 부트 블록(Boot Block)

 슈퍼 블록(Super Block)

 아이노드 블록(Inode Blocks)

 데이터 블록(Data Blocks)


· 부트 블록 : 운영체제를 부팅하기 위한 코드 저장

· 슈퍼 블록 : 파일 시스템과 관련된 정보를 담고 있음

· 아이노드 블록 : 파일에 대한 정보를 저장하고 있는 부분, 파일 하나당 반드시 하나의 아이노드를 가지고 있음

· 데이터 블록 : 파일에 실제로 보관해야 할 데이터들을 저장, 보관하는 데이터 크기에 따라 여러개일 수 있음


$ls -l

-

rw-r--r--

1

kimyh

graduate

30 

Nov 18 16:54

temp

파일유형

접근권한

하드링크수

소유자명

그룹명

파일크기

생성날짜

파일명

아이노드 블록에 저장

디렉터리 파일의 데이터 블록에 저장


· 파일

- 시스템에서 정보를 저장하기 위한 가장 기본적인 단위

- 단순히 바이너리 데이터의 흐름을 저장

- 논리적인 구조는 정해져있지 않음(프로그램에 의해 논리적인 구조 결정됨)


· 디렉터리 : 파일의 목록을 저장하기 위한 특수한 형태의 파일(디렉터리 파일)


$ls -lai : 각 파일의 아이노드 번호를 확인할 수 있음

· 디렉터리 항

- 디렉터리 파일의 목록

- 모든 디렉터리는 항상 두 개의 항을 가지고 있음

= 자기 자신을 나타내는 항 : .

= 부모 디렉터리를 나타내는 항 : ..

· od 명령어

- 지정한 파일의 데이터 블록의 내용을 출력

- 기본적으로 바이트의 값을 8진수 형태로 보여줌

$od -c : 문자 코드에 해당하는 값일 경우 실제 문자를 보여줌


119271 . \0

15552   . . \0

119272 f i l e \0

119273 t e x t \0

먼저 아이노드 나오고 다음으로 파일명에 해당하는 NULL문자로 종결


· 계층구조(트리구조)


· 절대경로 : 불변하는 절대적인 위치를 가지는 루트 디렉터리를 기준으로 파일의 위치 표현

· 상대경로 : 현재 디렉터리를 기준으로 파일의 위치 표현


 Q. 다음의 트리 구조에서 현재 디렉터리가 /root/bin일 때, banana 디렉터리를 절대 경로와 상대 경로로 표현하세요.

 A. 절대경로 : /home/banana

     상대경로 : ../../home/banana


· 새로운 파일 생성

① 생성할 디렉터리에 동일한 이름의 항이 존재하는지 확인

② 아이노드 블록 하나를 할당받음

③ 할당받은 아이노드 블록에 파일의 정보를 저장

④ 파일이 저장할 데이터의 크기에 따라 데이터 블록 할당받음


Q. 임의의 텍스트 파일 temp.txt를 하나 만들고, 그 파일의 권한을 소유자는 읽기, 쓰기, 실행이 가능하도록 권한을 주고, 동일 그룹은 읽기만 가능하고, 기타 사용자는 실행만 가능하도록 권한 설정하는 명령어를 쓰세요.

A. $ touch temp.txt

   $ chmod 741 temp.txt


   $ cat > temp.txt

   $ chmod 741 temp.txt


· 소유권과 허가

- 소유권

= 파일이 어느 사용자의 것인지 나타냄

= 모든 파일은 시스템에 등록된 사용자 중 한 사용자의 소유


- 허가

= 모든 파일 : 읽기, 쓰기, 실행 권한

= 소유주 / 동일 그룹 사용자/ 기타 사용자

· 접근 권한 수정

$ chmod 644 file : file의 권한을 644로 변경

· 파일의 유형

- 일반 파일 : 흔히 접하는 파일 유형으로 실행파일, 디렉터리 파일 등

- 특수 파일 : 주기억장치, 보조기억장치, 파이프, 터미널 연결상태 등

= 'c'와 'b'로 표현됨

= 'c'는 문자(character) 단위로 데이터를 전송하는 디바이스

= 'd'는 블록(block) 단위로 데이터를 전송하는 디바이스

· 'tty' 명령으로 자신의 연결 상태가 어떤 파일로 표현되어 있는지 확인 가능

 $tty

 /dev/pts/7

 $ls -l /dev/pts

 total 0

 crw--w---- 1 fineplus tty 136, 2 Nov 18 19:26 2

 crw--w---- 1 kimyh   tty 136, 7 Nov 18 19:57 7

 $who

 fineplus pts/2

 kimyh   pts/7


03 파일 다루기

 함수

 의미

 open

 이미 존재하는 파일을 읽기 또는 쓰기용으로 열거나, 새로운 파일을 생성하여 연다.

 creat

 새로운 파일을 생성하여 연다.

 close

 open 또는 creat로 열려진 파일을 닫는다.

 read

 열려진 파일로부터 데이터를 읽어 들인다.

 write

 열려진 파일에 데이터를 쓴다.

 lseek

 파일 안에서 지정한 바이트 위치로 이동한다.

 unlink, remove

 파일을 삭제한다.


 /*program ex03-01.c*/

 #include<sys/types.h>

 #include<fcntl.h>

 #include<unistd.h>

 #include<stdio.h>

 #include<string.h>


 void main()

 {

     int filedes, fdnew1, fdnew2;

     ssize_t nread;

     off_t newpos;


     char buffer[1024];

     char content[] = "Hello my friend!!\n";


     filedes = open("data.txt", O_RDWR);


     nread = read(filedes, buffer, 1024);

     printf("%s", buffer);


     write(filedes, content, strlen(content));


     newpos = lseek(filedes, (off_t)0, SEEK_SET);

     nread = read(filedes, buffer, 1024);

     printf("%s", buffer);


     close(filedes);


     fdnew1 = open("newdata1.txt", O_RDWR | O_CREAT, 0644);

     fdnew2 = creat("newdata2.txt", 0644);


     close(fdnew1);

     close(fdnew2);

     unlink("newdata2.txt");

 }


· 파일을 다루는 프로그램을 작성할 때 반드시 알아야 하는 두 가지의 개념

<파일 기술자> <읽기/쓰기 포인터>
· 파일 기술자

- 실행중인 프로그램과 하나의 파일 사이에 연결된 개방 상태

- 음수가 아닌 정수형 값으로 시스템이 결정

- 프로그램 작성 시 실제 값이 무엇인지 알 필요 없음

- 파일 개방 실패하면 -1이 됨

- 커널에 의해서 관리

- 하나의 프로그램은 동시에 여러 개의 파일을 개방할 수 있음

- 여러 개의 프로그램이 동시에 하나의 파일을 개방할 수 있음

- 어떤 경우든 커널에 의해서 각 개방상태가 유일하게 식별되어 관리됨


· 읽기/쓰기 포인터

- 개방된 파일 내에서 읽기 작업이나 쓰기 작업을 수행할 바이트 단위의 위치

- 특정 위치를 기준으로 한 상대적인 위치를 의미하는 오프셋(offset)

- 파일 개방한 직후 읽기/쓰기 포인터 : 0

= 파일의 첫번째 바이트 가리킴

= 파일의 내용을 읽거나 파일에 새로운 데이터가 작성되면 그만큼 증가함

= 파일을 다 읽으면 파일의 마지막을 의미하는 EOF(end-of-file) 가리킴

- 파일 기술자마다 하나씩 존재

= 서로 다른 프로그램이 동일한 파일을 개방해도 파일 기술자가 다르기 때문에 마찬가지로 서로 다른 읽기/쓰기 포인터를 갖음

= 서로의 작업이 상대에게 영향을 주지 않음


· open : 이미 존재하는 파일을 읽기 또는 쓰기 용으로 열거나, 새로운 파일을 생성하여 연다.

- 절대경로로 지정

filedes = open("/home/lsp/data.txt", O_RDONLY);

- 상대경로로 지정

filedes = open("data.txt", O_RDONLY);


- O_RDONLY : 읽기만 가능한 상태로 접근

- O_WRONLY : 쓰기만 가능한 상태로 접근

- O_RDWR : 읽기, 쓰기 모두 가능한 상태로 접근


- 반환값

= 0 : 표준 입력

= 1 : 표준 출력

= 2 : 표준 에러

= -1 : 개방 실패(파일 존재하지 않거나 접근권한 없음)

+ if(filedes = -1)

{

 printf("file open error!!n");

 exit(1);

}

· close : 열려진 파일을 닫는다.

- 할당받은 파일 기술자를 반환

- 사용이 끝나면 반드시 닫아야함

= 하나의 프로세스가 동시에 개방할 수 있는 파일의 수는 제한되어 있음

= 시스템 차원에서 동시에 개방할 수 있는 파일의 수는 제한되어 있음

+ filedes = open("data.txt", O_RDONLY); //파일을 읽기전용으로 개방

...

close(filedes); // 파일 닫기


· open으로 새로운 파일 생성하기

- O_CREAT 플래그 : open으로 새로운 파일 생성할 때 사용

+ filedes = open("data.txt", O_RDONLY | O_CREAT, 0644);

- O_EXCL 프래그 : 이미 존재하는 파일을 O_CREAT 플래그를 사용해 개방할 때 O_EXCL이 파일 개방 막음(개방 실패)

= 이미 존재하는 파일을 O_CREAT 플래그 사용해 개방하면 기존의 내용을 수정할 수 있는 경우 방지

= O_EXCL 플래그를 사용해 개방 자체를 실패하게함


· 플래그 종류

- O_RDONLY

- O_WRONLY

- O_RDWR

- O_CREAT

- O_EXCL

- O_APPEND

= 파일을 개방한 직후에 읽기/쓰기 포인터를 파일 내용의 마지막 바로 뒤로 이동

= 파일 개방 후 기존 데이터 보존

- O_TRUNC

= 파일 개방한 직후에 읽기/쓰기 포인터를 파일 내용의 첫 부분으로 이동

= 파일 개방 후 기존 데이터 삭제


· creat : 새로운 파일을 생성하여 연다.

- creat는 open을 O_WRONLY, O_CREAT, O_TRUNC와 함께 사용

- 이미 존재하는 파일을 지정해 creat하는 경우 : 파일 개방과 동시에 가지고 있는 데이터를 모두 삭제

- creat에서 지정한 파일이 함부로 변경되면 안 될 때 O_EXCL 플래그와 함께 사용하면 됨


· read : 열려진 파일로부터 데이터를 읽어 들인다.

· write : 열려진 파일에 데이터를 쓴다.

read

O_RDONLY

O_RDWR

write

O_WRONLY

- read

+ if((nread = read(filedes, buf, BUFSIZE)) > 0) // read가 정상적으로 수행되었는지 검사

= 대부분의 경우 세번째 인수 count로 지정한 값이 반환됨

= 파일의 마지막 부분을 읽을 경우 count보다 작은 값이 반환됨

= 반환값이 0일 경우 읽기/쓰기 포인터가 EOF에 있음

= 0 이상의 값이 반환 : 호출 성공

= 0 반환 시 내용 모두 읽어서 더이상 읽을 것이 없음을 의미

- write

+ if(write(filedes, buf, nread) < nread) // write가 정상적으로 수행되었는지 검사

= 모든 경우에서 반환값은 세번째 인수 count로 지정한 값이 반환됨

= 반환값이 count로 지정한 값이 아닌 경우 쓰기 작업이 실패

= write는 항상 세 번째 인수로 지정한 값이 반환되어야 호출 성공

= 호출 실패할 경우 : 반환값 < 세번째 인수의 값


· lseek : 파일 안에서 읽기/쓰기 포인터를 지정한 바이트 위치로 이동한다.

+ off_t newpos;

  newpos = lseek(filedes, (off_t) offset, int whence);

= whence (SEEK_SET, SEEK_CUR, SEEK_END)


· unlink/remove : 파일을 삭제한다.

- pathname으로 지정한 파일을 삭제

- 비어있는 디렉터리는 remove만 삭제 가능(unlink는 불가능)

- 비어있지 않은 디렉터리는 둘 모두 삭제할 수 없음



04 파일의 관리

함수

 의미

 umask

 파일 생성 마스크를 설정한다.

 access

 파일에 대한 사용자의 접근 권한을 확인한다.

 chmod, fchmod

 파일에 대한 접근 권한을 변경한다.

 chown, fchown

 파일의 소유주와 그룹을 변경한다.

 link

 파일의 새로운 이름을 생성한다.(Hard Link)

 rename

 파일의 이름이나 위치를 변경한다.

 symlink

 파일의 새로운 이름을 생성한다.(Soft Link, Symbolic Link)

 readlink

 심볼형 링크의 값을 읽어온다.

 stat, fstat

 파일의 상태 정보를 가져온다.


#include<unistd.h>

#include<fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <stdio.h>


int main()

{

     char *originalname = "test.txt";

     char *hardfilename = "test.txt.hard";

     char *softfilename = "test.txt.soft";


     int filedes, retval;


     mode_t oldmask;

     char bufer[1024];

     int nread;

     struct stat finfo;


     oldmask = umask(0377);


     filedes = open(originalname, O_RDWR | O_CREAT, 0755);

     close(filedes);


     if(retval = access(originalname, W_OK) == -1)

     {

          printf("%s is not writable\n", originalname);

          chmod(originalname, 0644);

     }


     link(originalname, hardfilename);

     symlink(originalname, softfilename);


     rename(hardfilename, "newname.txt");


     nread = readlink(softfilename, buffer, 1024);

     write(1, buffer, nread);


     stat(originalname, &finfo);

     printf("\n%s\n", originalname);

     printf("File mode : %o\n", finfo.st_mode);

     printf("Files size : %d\n", (int)finfo.st_size);

     printf("Num of blocks : %d\n", (int)finfo.st_blocks);

}


05 디렉터리 다루기

 함수

 의미

 mkdir

 새로운 디렉터리를 작성한다.

 rmdir

 디렉터리를 삭제한다.

 opendir

 디렉터리를 파일처럼 개방한다.

 closedir

 개방한 디렉터리를 닫는다.

 readdir

 개방된 디렉터리로부터 디렉터리 항목을 읽어온다.

 rewinddir

 개방된 디렉터리 스트림을 초기화한다.

 chdir

 디렉터리 경로를 변경한다.

 getcwd

 현재 작업 디렉터리를 구한다.


+

· 커널(Kernel)

- UNIX의 가장 핵심적인 부분

- 하드웨어를 보호(캡슐화)

- 주기억장치에 상주

- 프로세스 관리, 기억장치 관리, 입·출력 관리 등

· 셸(Shell)

- 명령어 해석기

- 시스템과 사용자간의 인터페이스 담당

- DOS의 COMMAND.COM과 같은 기능 수행


※ 컴파일러와 인터프리터의 비교

구분

컴파일러

인터프리터

번역 단위

전체

행(줄)

목적 프로그램

생성함

생성하지 않음

실행 속도

빠름

느림

번역 속도

느림

빠름

관련 언어

FORTRAN, COBOL, C, ALGOL 등

BAIC, LISP, APL, SNOBOL 등


'일상 > 끄적끄적' 카테고리의 다른 글

제안서 + 특허  (0) 2017.06.20
4차 산업혁명 기술 및 등장배경  (0) 2017.06.17
빌립보서 4장 13절  (4) 2017.05.16
이사야 41장 10절  (0) 2017.02.09
블로그 시작!  (0) 2017.01.28

+ Recent posts