section 구분
1. 실행가능한 프로그램이나 셸 명령어
2. 시스템 콜
3. 라이브러리 함수
4. 특별한 파일들(디바이스 파일 등)
5. 파일 포맷
6. 게임
7. 규격 등
8. 시스템 관리용 명령어$man 3 strlen
다른 프로그램들과 링크되기 위하여 존재하는, 하나 이상의 서브루틴이나 함수들의 집합 파일
링커가 프로그램이 필요로 하는 부분을 라이브러리에서 찾아 실행파일에다가 바로 복사
실행파일에 다 들어가기 때문에 실행할 때 라이브러리가 필요없다.
$ gcc -c func1.c func2.c
//func1.o와 func2.o를 정적 라이브러리 libfoo.a에 추가
$ ar crv libfoo.a func1.o func2.o
//ar -t libfoo.a 명령어를 통해 아카이브에 있는 파일 리스트를 출력할 수 있다.
$ gcc program.c -o program libfoo.a
$ ./program
파일 포맷이 ELF이면 .so / a.out이면 .sa
링커가 실행파일에다가 단지 '실행될 때 우선 이 라이브러리를 로딩시킬 것' 이라는 표시를 해둔다. 그러면 실행할 때 라이브러리에 있는 컴파일 코드를 가져와 사용한다.
//fPIC 옵션은 프로세스의 가상 주소 공간안의 다른 지역에 로드될 수 있도록 코드를 컴파일함
$ gcc -fPIC -c *.c
// -shared 옵션은 공유 라이브러리를 만든다는 옵션이다.
// -WL 옵션은 gcc에게 콤마로 부분된 다음 옵션을 링커에게 알려주기 위한 것이다.
// -soname, libfoo.so.1 라이브러리에 대한 soname을 고정시키는 부분이다.
$ gcc --shared -WL, -soname, libfoo.so.1 -o libfoo.so.1.0 *.o
$ ln -s libfoo.so.1.0 libfoo.so.1
$ ln -s libfoo.so.1 libfoo.so
//현재 폴더를 공유 라이브러리 탐색 경로에 넣어준다.
$ LD_LIBRARY_PATH = 'pwd':$LD_LIBRARY_PATH; export LD_LIBRARY_PATH
//su: 변경하고자 하는 ID로 변경해줌
//su 뒤에 변경할 사용자 ID를 입력하지 않는다면 su root와 동일하게 동작
$ su
# cp libfoo.so.1.0 /usr/local/lib
//Idconfig는 /etc/Id.so.conf에 지정된 디렉터리를 찾아다니면서 발견된 각각의 동적 라이브러리들에 대해서 라이브러리의 soname에 의해서 불리어지는 심볼릭 링크를 생성한다.
공유 라이브러리를 이용해서 컴파일을 할 경우 .so를 먼저 경로에서 찾고 없으면 .a를 찾아 주소값을 결정한다.
# /sbin/Idconfig
#(cd /usr/local/lib; ln -s libfoo.so.1 libfoo.so)
//ldconfig는 /etc/ld.so.conf에 지정된 디렉토리를 찾아다니면서 발견된 동적 라이브러리들에 대한 soname에 의해서 불리어지는 심볼릭 링크를 만들어낸다. ld.so가 파일의 이름을 얻으려고 할 때 이것은 soname을 발견한 파일의 디렉토리를 선택하는 그러한 일을 한다. 그리고 이렇게 함으로서 우리가 라이브러리를 추가할 때마다 ldconfig를 수행할 필요는 없게 되는 것이다. ldconfig는 리스트에 새로운 디렉토리를 만들어 널때만 실행시키면 된다. soname은 라이브러리 내에 포함되어 있는데, 위에 -soname libmyfile.so.1에서 libmyfile.so.1이 soname이다. soname은 버전을 관리하는 것과 관계가 있다.
리눅스에서는 기본적으로 공유 라이브러리가 있으면 그것과 링크 시키고, 그렇지 않으면 정적 라이브러리를 가지고 링크 작업을 한다.
+)
static library는 컴파일시 실행파일에 저장되므로 내용 변경시 다시 컴파일해야하지만
shared library는 어느 것을 로딩해오라는 설정만 해놓은 것이기 때문에 다시 컴파일 안해도 된다(하지만 보통 라이브러리 이름을 mycp.1.0.1.so 이런식으로 하기 때문에 심볼릭 링크 파일을 이용한다.)
include <>
시스템 헤더 파일을 include 하는데 사용
경로가 <>는 표준 라이브러리가 있는 /usr/include/stdio.h, stdlib.h 등
include ""
유저의 헤더파일을 include 하는데 사용
사용자가 사용중인 소스파일에 있는 위치에서 헤더파일을 가져옴
없을 시에는 /usr/include/ 에서도 찾습니다.
#include "../filedir/apue.h"
//또는
$ gcc -I/filedir/ my_cp.c
따라서 <>는 ""에 포함된다고 볼 수있습니다.
1) 명령 모드
a - 커서 오른쪽에 문자 삽입
A - 커서 오른쪽, 행의 끝에 문자 삽입
i - 커서 왼쪽에 문자 삽입
I - 커서 왼쪽, 행의 처음에 문자 삽입
o - 커서 아래에 행 삽입
O - 커서 위에 행 삽입
0 - 커서가 있는 줄 맨앞으로 감
$ - 커서가 있는 줄 맨 뒤로 감
( 현재 문장 처음
) - 현재 문장 끝
{ - 현재 문단 처음
} - 현재 문단 끝
숫자- - 숫자만큼 윗줄로 이동
숫자+ - 숫자만큼 아래줄로 이동
[숫자]G - 파일의 끝으로 이동(대문자사용)
ctrl + G - 현재 filename과 커서의 라인 정보 반환
r - 한문자 변경
커서 이동
Ctrl + i - 한 화면 위로 이동
Ctrl + b - 한 화면 아래로 이동
Ctrl + d - 반 화면 위로 이동
Ctrl + u - 반 화면 아래로 이동
Ctrl + e - 한 줄씩 위로 이동
Ctrl + y - 한 줄씩 아래로 이동
변경
cc - 커서가 있는 그 줄의 내용 변경
cw - 커서가 있는 단어 변경
C - 커서 오른쪽의 행 변경
s - 커서가 위치한 문자열 대체
S - 커서가 위치한 라인의 문자열 대체
r - 커서 위치 문자를 다른 문자로 대체
r+Enter - 행 분리
J - 현재 행과 아래 행 결합
xp - 커서 위치 문자와 오른쪽 문자 교환
~ - 문자형(대, 소문자) 변경
u - 이전 명령 취소
U - 행 변경 사항 취소, 이전의 최종 행 취소
. - 이전 최종 명령 반복
삭제
x - 커서가 있는 문자 삭제
nx - 커서가 있는 위치부터 n개의 문자를 삭제
dw - 현재 커서에 있는 한 단어 삭제
dd - 커서가 있는 라인 삭제
ndd - 커서가 있는 라인부터 n개의 라인 삭제
db - 커서의 위치에서 거꾸로 한 단어 삭제
D - 커서 오른쪽 행 삭제
:5,10d - 5~10번째 행 삭제
복사 및 이동
yy - 커서가 위치한 줄 복사
Y - 행 yank 또는 복사
yh - 커서의 왼쪽 문자 복사
yl - 커서에 위치한 문자 복사
yi - 커서가 위치한 줄과 그 아랫줄 복사
yk - 커서가 위치한 줄과 그 윗줄 복사
p - yank 되거나 삭제된 행 현재 행 위로 삽입
P - yank 되거나 삭제된 행 현재 행 아래에 삽입
:1,2 co 3 - 1~2행을 3행 다음으로 복사
:4,5 m 6 - 4~5행을 6행 위로 이동
탐색 및 대체 명령어
/{검색할 문자열} - 오른쪽 아래 방향으로 문자열 검색
?{검색할 문자열} - 왼쪽 위 방향으로 문자열 검색
n - 문자열의 다음으로 계속 검색
N - 문자열의 이전으로 계속 검색
:g/search-string/s/ - 각 발생 탐색 후 확인하고 대체
:s/string/rep - 현재 행의 str을 rep로 대체
:1,.s/string/rep/ - 1부터 현재 행의 str을 rep로 대체
:%s/string/rep/g - 파일 전체 str을 rep로 전부대체
:.$/aaa/bbb - 커서의 위치로부터 파일의 끝까지 있는 모든 aaa를 bbb로 대체
파일 명령어
:r {파일명} //커서 다음에 파일 삽입
:{행번호} r {파일명} //입력한 파일을 입력한 행번호 다음에 삽입
2) 입력 모드
i나 a를 이용해서 자유롭게 작성
3) 마지막 행 모드
:w - 현재 파일명으로 파일 저장(저장만 꺼지지 않음)
:w [파일명] - 입력한 파일명으로 파일 저장('')
:q - vi 저장안하고 종료
:q! - vi 강제 종료
:wq - 저장 후 종료
:wq! - 강제 저장 후 종료
:f [파일명] - 파일이름을 [파일명]으로 변경
:숫자 - 해당 라인으로 커서 이동
:$ - 파일의 맨 끝 줄로 이동
:e! - 마지막 저장 이후 모든 편집 취소
:/문자열 - 현재 커서 위치에서부터 파일 앞쪽으로 문자열 탐색
:?문자열 - 현재 커서 위치에서부터 파일 뒤쪽으로 문자열 탐색
:set nu 또는 :set number - vi 라인 번호 출력
:set nonu - vi 라인 번호 출력 취소
vi 화면 분할
수평 분할
ctrl + w -> n
:new
:sp
:split
:20sp //20칸 짜리 만들고 싶을 때
:sp filename //특정 파일을 창분할로 열고 싶을 때
수직 분할
ctrl + w -> v
:vs
:vsplit
:vs ./ //파일 브라우징
분할된 화면에서 커서 위치 변경하기
ctrl + w -> w
ctrl + w -> [h, j, k, l]
분할 창 닫기
:q
:qa //전체 닫기
ctrl + W -> o //현재 화면만 두고 나머지 분할 창 닫기
분할 창 위치 바꾸기
ctrl + w -> r //다음 화면과 위치 바꾸기
분할한 창의 크기 변경
ctrl + w -> = //전체 창 크기 같게
ctrl + w -> - //한칸씩 작게
ctrl + w -> + //한칸씩 크게
ctrl + w -> 5+ //한꺼번에 5칸 크게
ctrl + w [숫자]> //옆으로 늘이기
ctrl + w [숫자]< //옆으로 줄이기