리눅스

chapter01 유닉스 시스템 프로그래밍 개요

정지홍 2023. 2. 7. 17:25

유닉스 시스템 프로그래밍?

-유닉스에서 제공하는 프로그래밍 인터페이스(시스템 콜, 시스템 함수)를 이용해서 프로그램을 작성하는 것을 의미한다.

 

유닉스?

-켄톰슨과 데니스 리치가 개발한 운영체제

-버전3에서 C언어를 이용하여 다시 만들어서 고급언어로 작성된 최초의 운영체제

-파일 시스템의 접근, 사용자와 시스템의 정보, 네트워킹 등 다양한 서비스 제공

 

시스템 호출이란?

-유닉스에서 제공하는 서비스를 이용하여 프로그램을 구현 할 수 있게 제공되는 프로그래밍 인터페이스를 의미

-기본적인 형태는 C언어 함수와 같다.

-시스템 호출의 대부분의 리턴값은 시스템 호출 성공 or 실패를 알려주는 정수값 리턴

 

ANSI C표준

-ANSI(미국 표준 협회)가 표준화한 C언어이며 이는 ISO 국제표준기구가 국제 표준으로 인정

 

POSIX

-유닉스에 기반을 둔 표준 운영체제 인터페이스

-서로 다른 유닉스 시스템 사이에서 서로 이식이 가능한 응용 프로그램 개발을 위하여 정한 표준

 

버전1 ,2 , 3등등 존재하며 새로운 버전을 만들면 옛날 기능은 버벅거린다.

 

X/OPEN 가이드

-유럽에서 설립된 단체

-개방 시스템의 표준 정의 및 보급을 목적으로 함

 

단일 유닉스 규격

-OS가 유닉스라는 이름을 사용하기 위해서 지켜야하는 표준

 

라이브러리

-미리 컴파일된 함수들을 묶어서 제공하는 형태의 특수한 파일

-운영체제의 기능을 제공

 

라이브러리 함수

-라이브러리에 있는 함수

-개발을 쉽게 하며 컴파일의 속도를 빠르게 한다.

-lib.a 정적라이브러리: 컴파일 시에 같이 적재->실행파일이 무거워진다.

-lib.so 공유 라이브러리: 실행파일의 무게에 영향을 안준다. 해당 파일 실행시에 메모리에 라이브러리 적재된다. 또 한 다른 실행 파일에서도 공유 가능

 

시스템호출과 라이브러리 함수 다른점은?

-시스템호출은 커널을 직접 호출하지만 라이브러리 함수는 그렇지 않다.

 

유닉스는 사용자를 위해서 유닉스가 제공하는 명명,함수 등 다양한 서비스에 대한 맨 페이지를 제공한다. 이를 man명령어를 이용해서 사용할 수 있다. 

맨페이지 섹션1은 일반적인 명령에 관한것, 섹션2는 시스템호출, 섹션3은 라이브러리 함수


오류 처리 방법

라이브러리 함수는 오류 발생시 NULL리턴(리턴값이 정수형이면 -1 반환)

 

폴더: 옛날에 컴퓨터가 비쌌을때 캐비넷에 자기 징정쓰는 것 처럼 windows,unix(dir=folder)으로 사용

 

유닉스 기본 명령

-telnet:유닉스 시스템에 접속

-SSH:접속시 telnet보다 보안성 강화를 시킨것

-logout:접속 해제

-exit:접속 해제

-pwd:현재 디렉토리 경로 출력

-ls:디렉토리 내용 출력

-cd:디렉토리 변경

-cp:파일/디렉토리 복사

-mv:파일/디렉토리 이름 변경 및 이동

-rm:파일/디렉토리 삭제

-mkdir:디렉토리 생성

-rmdir:디렉토리가 비어있을때 그 디렉토리 삭제

-cat:파일 내용출력

-more:파일 내용을 페이지 단위로 출력

-chmod:파일 접근 권한 변경

-grep:패턴 검색

-ps:현재 실행중인 프로세스의 정보 출력

-kill:프로세스 강제 종료

-su:사용자 계정 변경

-tar:파일/디렉토리 묶기

-whereis:파일 위치 검색

-which:파일 위치 검색

 

vi편집기 내부 명령

-기본 문서 편집기이며 vi로 문저 편집하려면 vi test.c처럼 파일명을 지정해서 실행

-FTP로 해도 된다.

-vi편집기로 작성한 프로그램은 컴파일을 거쳐야한다.

 

Makefile

-유닉스에서 여러 소스파일을 컴파일하는 방법, 컴파일 명령,링크 파일들, 실행파일명 등을 설정하는 파일이다.

 

makefile과 make 실습
파일 실행 및 실행파일 오브젝트 파일 삭제


오류 발생시 시스템호출은 -1 , 라이브러리 함수는 오류 발생시 NULL리턴(리턴값이 정수형이면 -1 반환)이다.

errno사용시 오류의 종류를 알려주는 코드값을 알 수 있으나 정확히 파악하기 어려우니 이를 메세지로 변환해주는 perror, str-error를 쓰면 더 좋다.

perror: errno에 저장된 상수를 읽어서 이에 해당되는 오류 메시지를 출력

access함수에서 오류 발생시 if문으로 들어가며 perror로 오류 메세지를 출력하고 프로그램을 종료해야하니 exit함수를 호출한다.
gcc로 오브젝트 파일 생성후에 실핼해보았다(중간에 오타가 있어서 다시 파일에서 수정함).\n perror가 파일 디렉토리에 unix.txt파일이 없다고 알려준다.


strerror: 안시 씨에서 정의한 함수

안시 씨에서 추가한 이 함수는 사용자가 오류 메세지를 적절히 가공하는 것이 가능하다.
rm -f를 사용해서 생성한 오브젝트 파일 ex1_4, ex1_5를 삭제하였다.


동적 메모리 할당

-malloc:지정한 크기만큼 메모리 할당하며 메모리 크기는 바이트 단위이다. 할당 메모리는 초기화x

-calloc:지정 크기만큼 메모리 할당. 할당된 메모리를 0으로 초기화.

-realloc:메모리 추가 할당. void realloc(할당받은 메모리를 가르키는 포인터, 할당할 메모리 크기)

-free:메모리 해제

 

명령행

-사용자가 명령을 입력하는 행(프롬프트가 뜨고 커서가 깜박거리는 행) 

 

명령행 인자

-명령행에서 명령을 실행할때 해당명령과 함께 지정하는 인자

ex) ls -l 명령에서의 -l

-메인 함수에서 명령행 인자를 받으려면 int main(int argc , char *argv[])로 정의해야한다.

-int argc는 명령과 인자의 개수, char *argv[]는 명령과 각 인자를 담고 있는 배열 

인자로 파일명 외에 -h와 100을 전달하였으며 그냥 입력 했을때는 argc=1이지만 인자 전달했을때 argc=3으로 출력된 것을 볼 수 있다.

 


옵션 처리 getopt

-위에서 argc,argv를 일일히 처리하는 작업을 해결하기 위해서 제공되는 함수

-argv에 optstring에 지정된 옵션과 동일한 옵션 문자 존재시 해당 문자를 리턴