리눅스 운영체제 주요 개념

- 파일 시스템, 프로세스, 스트림

 

운영체제 개요

- 역활 : 하드웨어, 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 명령어 실행 결과

+ Recent posts