리눅스 운영체제 주요 개념
- 파일 시스템, 프로세스, 스트림
운영체제 개요
- 역활 : 하드웨어, SW 자원 관리, 시스템 콜 등
- 운영체제 패키지 : 셸, util-linx, procps, gnu coreutils/grep/diffutils/libc, libs, 개발 환경, X window
- 커널 : 리눅스 핵심, vmlinuz 파일 /boot
- 디바이스 드라이버 : CPU, ram, 그래픽/네트워크 어뎁터 등 다양한 종류의 특정 디바이스을 제어하기 위한 SW
- 시스템콜 : 응용 어플이 간접적으로 하드웨어 제어를 하도록 제공하는 API로 커널을 불름(call), open, read, write, fork 등
파일 시스템
- 파일 종류 : 일반 파일, 디렉터리, 심볼릭 링크(바로가기), 디바이스 파일(디바이스를 파일로 인식), 파이프, 소켓
- 메타 정보 : 파일이 가진 데이터 외 정보 - 종류, 권한, 크기 등
- 파일 시스템 종류 : ext4(리눅스 파일시스템), nfs(네트워크 파일 시스템)
프로세스
- 실행중인 프로그램의 동작 단위
- 프로세스 ID : 프로세스 구분하기 위한 식별자, 프로그램 한개에 여러 프로세스 존재 가능
- 시그널 : 프로세스 제어에 사용되는 신호
스트림
- 바이트 스트림 : 바이트들이 흘러가는 통로, 파일을 통해 이뤄짐
- 종류 : file, 스트림 커널
- 용도 : 파일 입출력, 파이프(프로세스 사이의 스트림), 디바이스 스트림(장치 입출력), 네트워크통신->프로세스간 통신IPC
다중 사용자 시스템
- 윈도우, 리눅스 <-> 안드로이드, IOS(단일 사용자 시스템)
- 다중 사용자 시스템 사용 이유 : 다중 사용자를 고려해서 설계하는 것이 더 안전하므로
단말 개요와 종류
- 구성 요소의 가장 끝단 terminal에 위치 한 장치
- 텔레타이프 : 초기 디스플레이가 없는 텔레타이프(teletype)를 이용. 여기서 tty라는 이름이 사용
- thumb terminal : 문자만 표기가능한 디스플레이가 추가됨.
- X termnial : 요즘 모니터(비트맵 디스플레이)를 탑제한 단말. X 윈도우 시스템 클라이언트로 화면 출력
* X 윈도우 시스템(X11) : 서버-클라이언트 모델의 GUI. 클라이언트가 x 서버에 접속해서 요청하면 결과를 화면에띄워줌
- 단말 에뮬레이터 : 이전에 하드웨어로 만든 단말을 SW로 구현한 것으로 우분투 터미널, iTerm 같은것들
- 단말의 변화 흐름 : 텔레타이프 -> 문자 터미널 -> 비트맵 터미널 -> 단말 에뮬레이터
- 가상 콘솔(=터미널=단말) : 리눅스서 여러 가상콘솔동작 X 윈도우가 tty7 점유, [ctrl] + [alt] + [fn키]로 다른 tty로 변경 가능
![]() 텔레 타이프 : 출력이 종이에 적혀 나온다 |
![]() 덤 터미널 thumb terminal : 문자만 출력, VT100 |
![]() NCD-X terminal : 비트맵 디스플레이를 이용 |
![]() 단말 에뮬레이터 : SW로 가상화한 터미널, 위는 iterm |
파일, 디바이스, 단말
- 리눅스에선 모든 디바이스, 단말이 파일로 표현하여, 스트림으로 입출력 가능
- /dev 경로에 /dev/tty0, /dev/tty1로 존재.
+ 셸 : 명령어 해석기
스트림 시스템 콜
- 파일 디스트립터 : 커널이 만들어준 스트림 번호로 입출력시 사용
#include <unistd.h>
- ssize_t read(int fd, void *buf, size_t bufsize); : fd 읽어서 buf에 저장, ssize_t는 부호있는 정수(여러 플랫폼에 따라서 정수 크기가 다를 수 있음), size_t 부호 없는 정수, 읽은 크기 반환, 0은 끝 도달, -1은 에러, read()는 \0이 끝에 있는걸 전재 x
#include <unistd.h>
- ssize_t write(int fd, const *buf, size_t bufsize) : bufsize 만큼 읽어 fd에 씀.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
- int open(const char *path, int flags, (mode_t mode)) : mode는 create 플래그시 권한 지정
#include <unistd.h>
- int close(int fd) : fd 스트림 해제
- off_t lseek(int fd, off_t offset, int whence) : 파일 디스크립터 파일 오프셋 이동, whence 플래그(SEEK_SET : 파일 처음 기준, SEEK_CUR : 현재 기준, SEEK_END 끝 기준), lseek의 l은 Long 타입으로 seek()도 존재
- int dup(int oldfd), int dup2(int oldfd, int newfd) : oldfd를 복제
#include <sys/ioctl.h>
- int ioctl(int fd, unsigned long request, ... ) : 디바이스 처리 관련 시스템 콜 ex : dvd 여닫기, 프린터 구동, 단말 통신속도 조절 등, request는 작업을 의미하는 상수, ...는 가변 인자로 여러개 지정 가능
![]() |
![]() |
- int fcntl(int fd, int cmd, ...) : 파일 디스크립터 관련 작업 위주의 시스템 콜(ioctl과 구분)
cat 명령어 구현하기
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
static void do_cat(const char *path);
static void die(const char *s);
int main(int argc, char *argv[])
{
int i;
if (argc < 2)
{
fprintf(stderr, "%s : file name not given\n", argv[0]);
exit(1);
}
for (i=1; i< argc; i++)
{
do_cat(argv[i]);
}
exit(0);
}
#define BUFFER_SIZE 2048
static void do_cat(const char *path)
{
int fd;
unsigned char buf[BUFFER_SIZE];
int n;
fd = open(path, O_RDONLY);
if (fd < 0) die(path);
for (;;)
{
n = read(fd, buf, sizeof buf);
if (n < 0) die(path);
if (n == 0) break;
//STDOUT_FILENO : standard output stream = print buf data
//STDOUT_FILENO(is linux file descrypter in unistd.h)
//stdout is c standard io stream(in stdio.h, similar with STDOUT_FILENO)
if (write(STDOUT_FILENO, buf, n) < 0) die(path);
}
if (close(fd) <0) die(path);
}
static void die(const char *s)
{
perror(s);
exit(1);
}
* exit(0) : 정상 종료, exit(1) : 오류 종료, return과의 차이 : exit 즉시 프로세스 종료, return은 뒷 내용 마친 후 종료
cat 명령어 실행 결과
'컴퓨터과학' 카테고리의 다른 글
리눅스 프로그래밍 4 - 메모리, 프로세스, 시그널, 환경, 로그인 (0) | 2022.06.01 |
---|---|
리눅스 프로그래밍 3 - grep 구현, 리눅스 디렉터리구조, 파일시스템관련 명령어 구현 (0) | 2022.05.31 |
리눅스 프로그래밍 2 - stdio, head 구현, gdb 디버깅 (0) | 2022.05.31 |
파이썬 - 02. 원격 저장소 이용하기 + 온도변환기, 계산기, 스톱워치 (0) | 2022.05.11 |
파이썬 - 01. tkinter 기초(위젯, 레이아웃, 이벤트) + 원격저장소에 올리기 (0) | 2022.05.09 |