리눅스 프로그래밍

-유닉스 응용프로그램이 C로 작성된것은 사실이다.

(유일한 선택사항은 아님..)

 

리눅스 프로그램

-리눅스 응용프로그램은 두 가지의 특정 파일 형식을 가질 수 있다.

1)실행 파일

2)스크립트

*리눅스에서는 실행 파일이든 스크립트이든 특정 파일 이름이나 확장자를 가질 필요가 없다.

 

리눅스 시스템에 로그인하면 쉘 프로그램(bash를 많이 사용)과 상호 작용하게 된다.

쉘 프로그램은 요청한 프로그램을 이름으로 찾는데, 주어진 디렉토리 집합에서 지정한 이름을 가진 파일을 찾는다.

주어진 디렉토리 집합 -> 쉘 변수 PATH에 저장(:콜론을 사용하여 PATH변수의 항목을 구분)

-시스템 관리자가 검색 경로를 설정하고 검색 경로는 대개 시스템 프로그램이 저장되는 몇 가지 표준 장소를 포함하고 있다.

 

시스템 프로그램이 저장되는 몇 가지 표준 장소

  • / bin : 바이너리, 시스템을 부팅하는데 사용되는 프로그램

  • /usr/bin : 사용자 바이너리, 사용자가 사용할 수 있는 표준 프로그램

  • /usr/local/bin : 로컬 바이너리. 설치에 사용되는 프로그램

관리자가 사용하는 표준 장소

  • /bin

  • /usr/sbin

*/opt의 하위 디렉토리에는 선택적인 운영체제 구성요소와 타사 응용프로그램이 설치된다.

 

이 책에서는 gcc를 컴파일러로 쓴다.

-gccANSI표준을 준수 하기 때문이다.

 

응용 프로그램

-응용 프로그램은 대게 예약된 디렉토리에 있다.

  • /usr/bin : 프로그램 개발을 포함하여 일반적으로 사용되며 시스템이 제공하는 응용프로그램이 존재

  • /usr/local/bin : 시스템 관리자가 특정 호스트 컴퓨터나 로컬 네트워크를 위해 추가한 응용프로그램은 종종 /usr/local/bin이나 /opt에 존재

*관리자는 /usr/local/을 선호한다.

-공급 업체가 제공한 파일이나 시스템이 제공한 응용프로그램 이외, 이후에 추가된 별도의 프로그램을 저장하고 있다.

- /usr을 이런 식으로 조직하면 웅영체제를 업그레이드할 때 도움이 된다.

헤더 파일

-c에서 헤더파일은 대부분 항상 /usr/include와 이것의 하위 디렉토리에 있다.

/usr/include<sys or /usr/include/linux에 리눅스 구현 상황에 종속적인 헤더 파일 존재

 

표준 장소가 아닌 디렉토리나 하위 디렉토리에 있는 헤더 파일을 사용하기 위해 C컴파일러에 -I옵션을 지정할 수있다.

 

라이브러리

-라이브러리는 다시 사용할 수 있도록 작성된 미리 컴파일된 함수들의 묶음이다.

-표준 라이브러리는 대개 /lib/usr/lib에 저장된다.

*라이브러리를 표준 디렉토리에 올려놓고 컴파일러가 찾기를 바라는 것은 충분하지 못하다.

(라이브러리 이름은 특별한 규약이 있다, 그리고 명령줄에서 명시되어야 한다.)

 

  • 정적 라이브러리(static library) : .a

  • 공유 라이브러리(shared library) : .so

 

정적 라이브러리

-라이브러리의 가장 간단한 형식은 객체 파일을 사용할 준비가 된 형태로 묶는 것이다.

-프로그램이 라이브러리에 저장된 함수를 사용하고자 할 때, 프로그램은 함수를 선언하는 헤더 파일을 포함한다.

-컴파일러와 링커는 프로그램 코드와 라이브러리를 하나의 실행 가능한 프로그램으로 혼합한다.

- -ㅣ옵션을 반드시 사용하여 표준 C 런타임 라이브러리 이외에 어떤 라이브러리가 필요한지 지정해 주어야 한다.

-아카이브(archive)라고 알려진 정적 라이브러리는 .a확장자를 가진다.

-정적 라이브러리를 만드는 방법!!

ex)

1.fun1.c, fun2.c 파일을 만든다.

2.fun1,2.c파일의 오브젝트 파일을 만든다.

3.program.c에서 fun1,2에 있는 함수를 사용해야하니 lib.h라는 헤더파일을 만든다.

4.program.c라는 매인 함수가 있는 파일을 만든다.(lib.hinclude해야함.)

5.program의 오브젝트 파일을 만든다.

6.fun1.ofun2.ofun.a라는 오브젝트 파일로 만든다.

$ar crv fun.a fun1.o fun2.o

7.실행 파일을 만단다.

$gcc -o program program.o fun.a

ㄴ 이렇게 gcc로 묶어서 사용할 수도 있고, 지정해 줄 수도 있다.

지정하는 방법

$gcc -o program program.o -l(-L). -fun

-l : 표준 저장 장소에서 라이브러리를 찾는다.

-L : 현재 디렉토리에서 라이브러리를 찾는다.

 

 

 

공유 라이브러리

-공유 라이브러리를 사용하는 이유

많은 응용프로그램을 동시에 실행하면 응용프로그램들은 동일한 라이브러리의 함수를 사용한다.

이때 같은 함수의 여러 복사본이 메모리에 있게 되고 실제로 여러 복사본이 프로그램 파일 자체에 저장 되어 있다.

이것은 소중한 메모리와 디스크 공간의 상당한 낭비이며, 정적 라이브러리의 단점 중 하나이다.

-공유 라이브러리는 정적 라이브러리와 같은 장소에 저장되지만 다른 파일 확장자(*.so)를 가진다.
-
공유 라이브러리의 동작

  • 프로그램이 공유 라이브러리를 사용하면 함수 코드 자체는 포함하지 않고, 실행시에 사용 가능한 공유 코드를 참조하는 방식으로 공유 라이브러리를 링크시킨다.

  • 만들어진 프로그램을 메모리에 로드하여 실행할 때, 참조되는 함수를 호가인하고 공유 라이브러리를 호출한다.

  • 공유 라이브러리는 필요한 경우 메모리에 로드 된다.

-공유 라이브러리를 로드하고 클라이언트 프로그램 함수 참조를 확인하는 프로그램(동적 로더)ld.so라고 한다.

공유 라이브러리를 검색하기 위한 추가적인 장소를 /etc/ld.so.conf에서 구성할 수 있다.

이 파일을 수정하려면 ldconfig를 사용한다.

ldd유틸리티를 실행하여 프로그램이 요구하는 공유 라이브러리가 무엇인지 알 수 있다.

 

+ Recent posts