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 |