ab

ab는 “Apache HTTP server Benchmarking tool”의 약어로서 아파치서버의 응답속도를 측정하는 밴치마킹툴입니다.

ab라는 툴을 이용하여 아파치의 응답속도를 테스트하고 그 결과를 다양한 방면으로 확인할 수 있습니다.



사용형식

ab [ -k ] [ -i ] [ -n 요청수 ] [ -t 시간제한 ] [ -c 동시접속 ] [ -p POST file ] [ -A 인증 유저이름:패스워드 ] [ -P 프락시인증 유저이름:패스워드 ] [ -H Custom header ] [ -C Cookie name=value ] [ -T content-type ] [ -v verbosity ] ] [ -w HTML 출력 ] ] [ -x 속성 ] ] [ -y 속성 ] ] [ -z 속성 ] [http://]서버이름[:port]/path

ab [ -V ] [ -h ]



사용예 #1

–V를 사용하시면 설치되어 있는 ab의 버전을 확인하실 수있습니다. 아래 결과는 현재 필자가 사용하고 있는 ab의 버전이 2.0.40이라는 것을 표시하고 있습니다.

[root@host3 bin]# ab -V
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.116 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/

[root@host3 bin]#



사용예 #2

수퍼유저코리아(www.superuser.co.kr)의 응답속도를 측정한 것입니다. 참고로 사이트URL의 마지막에는 반드시 "/"가 들어가야함에 주의하시기 바랍니다. 여기서 사용한 옵션 -n은 측정을 위한 웹페이지 요청수를 의미합니다. 즉 "-n 1"이라고 한 것은 지정한 URL을 한번의 요청만으로 결과를 표시한다는 의미입니다.

[root@host3 bin]# ab -n 1 http://www.superuser.co.kr/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.116 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/

Benchmarking www.superuser.co.kr (be patient).....done


Server Software: Apache/2.0
Server Hostname: www.superuser.co.kr
Server Port: 80

Document Path: /
Document Length: 458 bytes

Concurrency Level: 1
Time taken for tests: 1.499567 seconds
Complete requests: 1
Failed requests: 0
Write errors: 0
Total transferred: 700 bytes
HTML transferred: 458 bytes
Requests per second: 0.67 [#/sec] (mean)
Time per request: 1499.567 [ms] (mean)
Time per request: 1499.567 [ms] (mean, across all concurrent requests)
Transfer rate: 0.00 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 17 17 0.0 17 17
Processing: 1482 1482 0.0 1482 1482
Waiting: 1481 1481 0.0 1481 1481
Total: 1499 1499 0.0 1499 1499
[root@host3 bin]#



사용예 #3

다음과 같이 -c옵션을 사용하면 한번에 수행할 다중 요구수를 지정할 수 있습니다. 지정하지 않는다면 기본값은 1이 됩니다. 테스트시에 –c 30이라고 주었으며, 결과를 보시면 “concurrency Level 30”이라는 것을 보실 수 있을 것입니다. 즉, 동시에 다중세션을 테스트한 것이며 그 결과를 확인 할 수 있습니다. 결과값의 분석은 앞에 설명된 내용과 비교하면서 보시기 바랍니다.

[root@host3 bin]# ab -c 30 http://www.yahoo.com/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.116 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/

Benchmarking www.yahoo.com (be patient).....done


Server Software:
Server Hostname: www.yahoo.com
Server Port: 80

Document Path: /
Document Length: 32247 bytes

Concurrency Level: 30
Time taken for tests: 1.75287 seconds
Complete requests: 1
Failed requests: 0
Write errors: 0
Total transferred: 32600 bytes
HTML transferred: 32247 bytes
Requests per second: 0.93 [#/sec] (mean)
Time per request: 32258.610 [ms] (mean)
Time per request: 1075.287 [ms] (mean, across all concurrent requests)
Transfer rate: 28.83 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 208 208 0.0 208 208
Processing: 866 866 0.0 866 866
Waiting: 219 219 0.0 219 219
Total: 1074 1074 0.0 1074 1074
root@host3 bin]#


크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2004/03/24 11:02 2004/03/24 11:02
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/186

홈페이지 백업 방법(웹호스팅)

퍼미션 재설정할 필요없이 한꺼번에 압축하고 풀기...

웹호스팅을 받다보면 개인 서버가 아니기 때문에 백업 하고 복구가 쉽지가
않은데 이 방법을 다들 아시겠지만.....

텔넷 접속하면 html 폴더가 있을 겁니다. 여기서 html을 통째로 압축해 보겠습니다.

[압축]
# tar cvfzp nanum.tar.gz html
[풀기]
# tar xvfzp nanum.tar.gz
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2004/03/24 09:08 2004/03/24 09:08
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/185

네트워크 카드가 잡히지 않아요.

네트워크 카드가 잡히지 않아요.

답변 :
설치시, 랜카드 설정단계에서 PCI 랜카드인 경우는 Autoprobe가 되고,
ISA 방식인 경우에는 irq 와 ioport 를 직접 설정해 주어야 합니다.
ISA 인 경우, 리눅스에서는 PNP 를 사용안하셔야 되고, 랜카드와 같이 들어있는 플로피에 있는 프로그램을 사용하여,
충돌되지 않은 irq 와 ioport 를 선택하시면 됩니다.
아니면, 윈도우 설정을 참고하여 하시면 됩니다.
확인은 /sbin/ifconfig 을 실행하여 eth0 가 나타나는 지를 확인하시면 됩니다.
설치시 랜카드 설정이 잘 안되었을 경우에는, linuxconf 라는 프로그램을 사용하시면 됩니다.
네트워크 관련 셋팅과 랜카드 설정을 같이 할 수 있습니다.
기타, ip 주소, DNS 서버설정, gateway 설정같은 경우는 linuxconf 을 사용하시거나,
netcfg 라는 프로그램을 사용하셔도 됩니다.



크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2004/03/22 16:22 2004/03/22 16:22
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/184

시스템 정보를 알아볼 수 있는 방법은 없을까요?
답변 : 다음과 같이 입력하시면 각각의 정보를 보실 수 있습니다.
cpu 정보 : cat /proc/cpuinfo
pci 정보 : cat /proc/pci
사용중인 irq 정보 : cat /proc/interrupts
사용주인 dma 채널 : cat /proc/dma
사용중인 i/o 포트 정보 :cat /proc/ioports
현재 사용가능한 화일 시스템 :cat /proc/filesystems
현재 사용중인 메로리 : cat /proc/meminfo
현재 사용중인 파티션 :cat /proc/partitions
현재 사용중인 스왑 파티션 정보 : cat /proc/swaps
현재 사용중인 커널 버전 : cat /proc/version
현재 사용중인 드라이버 :cat /proc/devices
현재 사용중인 부트 이미지 : cat /proc/cmdline
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2004/03/22 15:27 2004/03/22 15:27
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/183

해킹당한 명령어들 rpm 명령으로 (강제) 재설치하기



해킹을 당하게 되면 주로 root가 시스템관리를 위해서 자주사용하는 아래와 같은 명령어들이 동일한 이름의 다른 명령어로 대체되는 경우가 허다하다.

"/usr/bin"
"/usr/bin/find"
"/usr/bin/last"
"/usr/bin/top"
"/usr/bin/uptime"
"/usr/bin/w"
"/usr/bin/who"

따라서 이런 경우에 이런 명령어들을 재설치해야하는데, 가장 쉬운 방법이 신뢰성있는 ftp등의 사이트에서 rpm 패키지소스를 다시 가져와서 재설치해야 할 것이다.

그런데, rpm -Uvh등으로 재설치를 하려면 패키지의존성 때문에 재설치가 불가한 경우가 많다.

물론, 의존성있는 모든 패키지들을 하나씩 찾아서 재설치해주면 되지만, 보통작업이 아니므로 여기서는 필요한 패키지만을 강제적으로 재설치하는 방법(옵션)을 알아보도록 하겠다.



아래의 예를 보자.

[root@kebia_1 sspark]# rpm -Uvh procps-2.0.7-3.i386.rpm
package procps-2.0.7-3 is already installed
[root@kebia_1 sspark]#

위의 예처럼, ps라는 명령어를 재설치하기 위해서 Uvh라는 옵션으로 재설치하려했더니 이미 설치되어 있다고 나왔다.

그래서 rpm -qa라는 명령어로 ps와 관련된 패키지를 찾아서 패키지를 삭제하려 하였다.

[root@kebia_1 sspark]#
[root@kebia_1 sspark]# rpm -qa | grep ps
pspell-0.11.2-1
tetex-dvips-1.0.7-7
ypserv-1.3.11-9
procps-2.0.7-3
psmisc-19-4
psgml-1.2.1-8
[root@kebia_1 sspark]#
[root@kebia_1 sspark]# rpm -e procps-2.0.7-3
error: removing these packages would break dependencies:
procps >= 2.0.6-5 is needed by initscripts-5.49-1
libproc.so.2.0.7 is needed by rusers-server-0.17-6
[root@kebia_1 sspark]#


그랬더니, 위와 같이 패키지 의존성에러가 발생한다.

물론, 이 패키지들을 모두 찾아서 재설치할 수도 있으나, 너무 번거로운 작업이다.



이런 경우에 다음의 예와 같이 --force라는 옵션으로 원하는 패키지를 강제적으로 재설치할 수 있다.

[root@kebia_2 /root]# rpm -Uvh --force procps-2.0.7-3.i386.rpm
procps ##################################################
[root@kebia_2 /root]#



참고로 해당 명령어와 관련된 패키지를 찾는 rpm명령어는 다음과 같습니다.

예를 들어 ps라는 명령어와 관련된 패키지를 찾으려면 다음과 같습니다.

[root@kebia_1 sspark]# rpm -qf /bin/ps
procps-2.0.7-3
[root@kebia_1 sspark]#

이를 점검했다면 이 패키지가 설치했던 파일들을 알아볼 필요가 있겠지요..

다음과 같은 옵션을 사용하면 간단히 볼 수 있죠..

[root@kebia_2 report]# rpm -ql procps-2.0.7-3
/bin/ps
/etc/X11/applnk/Utilities/top.desktop
/lib/libproc.so.2.0.7
/sbin/sysctl
/usr/bin/free
/usr/bin/oldps
/usr/bin/pgrep
/usr/bin/pkill
/usr/bin/skill
/usr/bin/snice
/usr/bin/tload
/usr/bin/top
/usr/bin/uptime
/usr/bin/vmstat
/usr/bin/w
/usr/bin/watch
/usr/share/doc/procps-2.0.7
/usr/share/doc/procps-2.0.7/BUGS
/usr/share/doc/procps-2.0.7/NEWS
/usr/share/doc/procps-2.0.7/TODO
/usr/share/man/man1/free.1.gz
/usr/share/man/man1/oldps.1.gz
/usr/share/man/man1/pgrep.1.gz
/usr/share/man/man1/pkill.1.gz
/usr/share/man/man1/ps.1.gz
/usr/share/man/man1/skill.1.gz
/usr/share/man/man1/snice.1.gz
/usr/share/man/man1/tload.1.gz
/usr/share/man/man1/top.1.gz
/usr/share/man/man1/uptime.1.gz
/usr/share/man/man1/w.1.gz
/usr/share/man/man1/watch.1.gz
/usr/share/man/man5/sysctl.conf.5.gz
/usr/share/man/man8/sysctl.8.gz
/usr/share/man/man8/vmstat.8.gz
[root@kebia_2 report]#

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2004/03/21 06:00 2004/03/21 06:00
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/182

GCC 시작~!

명령행 상태에서 다음과 같이 입력해봅시다. 여러분이 사용하같고 있는 gcc 버전은 알아두고 시작하셔야겠죠?


[yong@redyong yong]$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-linux/2.7.2.1/specs
gcc version 2.7.2.1
[yong@redyong yong]$


gcc -v 이라고 입력하니까 ``Reading specs from..\'\' 이라같고 말하면서 그 결과값을 ``gcc version 2.7.2.1\'\'이라고 말해주고 있습니다. 자, 어디서 gcc 에 대한 정보를 읽어오는지 봅시다.


/usr/lib/gcc-lib/i386-linux/2.7.2.1/specs


gcc 를 여러분이 소스를 가져다 손수 설치해보신 적은 없을 것입니다. 보통은 바이너리 패키지로 된 것을 가져다 설치하지요. 나중에 정말 휴일에 너무 심심하다 싶으면 gcc 의 소스를 가져와서 컴파일해보십시요. 참, 재미있는 경험이 될 것입니다. 이미 여러분이 갖고 있는 gcc 를 가지고 새로운 gcc 를 컴파일하여 사용합니다. C 컴파일러를 가지고 새 버전의 C 컴파일러를 컴파일하여 사용한다! 이런 재미있는 경험을 또 어디서 해보겠습니까?

gcc 패키지가 어떤 것으로 구성되어 있는지.. gcc 가 제대로 설치되어 있는지 알아보면 좋겠죠?

다음과 같습니다.


/lib/cpp -----------> /usr/lib/gcc-lib/i386-linux/2.7.2.1/cpp ( 링크임 )
/usr/bin/cc -----------> gcc ( 링크임 )
/usr/bin/gcc C 컴파일러 ``front-end\'\'
/usr/bin/protoize
/usr/bin/unprotoize
/usr/info/cpp.info-*.gz GNU info 시스템을 이용하는 화일들
/usr/info/gcc.info-*.gz
/usr/lib/gcc-lib


마지막 /usr/lib/gcc-lib 디렉토리에 아래에 gcc 에 관한 모든 내용이 설치됩니다.

보통 다음과 같은 디렉토리 구조를 가집니다.


/usr/lib/gcc-lib/<플랫폼>/< gcc 버전 >


보통 우리는 리눅스를 i386 ( 인텔 환경 )에서 사용하고 있으므로 다음과 같이 나타날 것입니다.


/usr/lib/gcc-lib/i386-linux/2.7.2.1


( i386-linux, i486-linux, i586-linux 는 각기 다를 수 있습니다. 하지만 상관없는 내용입니다. 미친 척 하고 다른 이름을 부여할 수도 있습니다. )

그럼 계속 해서 /usr/lib/gcc-lib 밑의 내용을 살펴보죠.


/usr/lib/gcc-lib/i386-linux/2.7.2.1/cc1
/usr/lib/gcc-lib/i386-linux/2.7.2.1/cpp
/usr/lib/gcc-lib/i386-linux/2.7.2.1/include/*.h
/usr/lib/gcc-lib/i386-linux/2.7.2.1/libgcc.a
/usr/lib/gcc-lib/i386-linux/2.7.2.1/specs


cc1이 진짜 C 컴파일러 본체입니다. gcc 는 단지 적절하게 C 인가, C++ 인가 아니면 오브젝티브 C 인가를 검사하고 컴파일 작업만이 아니라 ``링크\'\'라는 작업까지 하여 C 언어로 프로그램 소스를 만든 다음, 프로그램 바이너리가 만들어지기까지의 모든 과정을 관장해주는 ``조정자\'\' 역할을 할 뿐입니다.

C 컴파일러는 cc1, C++ 컴파일러는 cc1plus, 오브젝티브 C 컴파일러는 cc1obj 입니다. 여러분이 C++/오브젝티브 C 컴파일러를 설치하셨다면 cc1plus, cc1obj 라는 실행화일도 찾아보실 수 있을 겁니다. cpp 는 \"프리프로세서\"입니다. #include 등의 문장을 본격적인 cc1 컴파일에 들어 가기에 앞서 먼저(pre) 처리(process)해주는 녀석입니다.

참고로 g++ 즉 C++ 컴파일러( 정확히는 C++ 컴파일러 프론트 엔드 )에 대한 패키지는 다음과 같습니다.


/usr/bin/c++ ---------------------------> g++ 에 대한 링크에 불과함
/usr/bin/g++
/usr/lib/gcc-lib/i386-linux/2.7.2.1/cc1plus ( 진짜 C++ 컴파일러 )


오브젝티브 C 컴파일러 패키지는 다음과 같습니다.


/usr/lib/gcc-lib/i386-linux/2.7.2.1/cc1obj
/usr/lib/gcc-lib/i386-linux/2.7.2.1/include/objc/*.h
/usr/lib/gcc-lib/i386-linux/2.7.2.1/libobjc.a


구성요소가 어떤 것인지 아셨으니 좀 도움이 되셨을 겁니다.

2.2 gcc 사용하기
hello.c 라는 지긋지긋한 소스 하나를 기준으로 설명합니다 ^^



--------------------------------------------------------------------------------

#include

int
main ( void )
{
(void) printf ( \"Hello, Linux Girls! =)\\n\" );
return 0;
}


--------------------------------------------------------------------------------


참고로 제일 간단한 소스는 다음과 같은 것입니다. ^^



--------------------------------------------------------------------------------

main () {}


--------------------------------------------------------------------------------


컴파일을 해보겠습니다! $ 는 프롬프트이지 입력하는 것이 아닌 것 아시죠?


$ gcc hello.c
$


무소식이 희소식이라... gcc 이렇게 실행하고 나서 아무런 메시지도 나오지 않고 다음 줄에 프롬프트만 달랑 떨어지면 그것이 바로 컴파일 성공입니다.

여러분은 무심코 다음과 같이 결과 프로그램을 실행시키려 할 것입니다.


$ hello
bash: hello: command not found
$


예. 땡입니다. ^^

여러분은 다음과 같이 실행시켜야 합니다.


$ ./a.out


맨 앞의 도트 문자(.)는 현재 디렉토리를 의미합니다. 그 다음 디렉토리 구분 문자 슬래쉬(/)를 쓰고 유닉스 C 에서 ``약속한\'\' C 컴파일러의 출력 결과 바이너리 화일인 a.out 을 써줍니다.

이러한 습관은 아주 중요합니다. 여러분이 현재 디렉토리에 어떤 실행 화일을 만들고 나서 테스트를 해 보려고 한다면 꼭 ./<실행 화일명> 이라고 적어줍니다.

유닉스는 기본적으로 PATH 라는 환경변수에 있는 디렉토리에서만 실행화일을 찾을 뿐입니다. 만약 PATH 라는 환경변수에 현재 디렉토리를 의미하는 도트 문자(.)가 들어있지 않으면 현재 디렉토리의 실행화일은 절대 실행되지 않습니다. 게다가 현재 디렉토리를 PATH 환경 변수에 넣어준다 할 지라도 도스처렁럼 현재 디렉토리를 먼저 찾는다든지 하는 일은 없습니다. 오로지 PATH 에 지정한 순서대로 수행합니다.

실행 바이너리명이 계속 a.out 으로 나오면 좀 곤란하죠. 뭐 물론 mv 명령으로 a.out 의 이름을 바꾸면 되지만서도...


-o 옵션


-o 옵션( 소문자 o 임! )은 출력(output) 화일명을 정하는 옵션입니다. 위에서 우리는 hello.c 라는 소스를 가지고 일반적으로 hello 라는 이름의 실행화일을 만들고 싶어할 것입니다.


$ gcc -o hello hello.c
^^^^^^^^


또는 다음과 같이 순서를 바꿔도 무방합니다.


$ gcc hello.c -o hello
^^^^^^^^


워낙 유닉스 쪽은 명령행 방식이 전통적으로 주된 방식이라 명령행에서 하는 일은 뛰어납니다.

당연히 실행을 하려면 ./hello 라고 하셔야 합니다. 결과는 다음처럼 나오겠지요?


$ ./hello
Hello, Linux Girls! =)
$



주의
제일 안좋은 습관 중 하나가 바로 테스트용으로 만든 소스라고 다음처럼 하는 것입니다.


$ gcc -o test test.c
$ test
$


문제를 알아내기 위하여 위에서 작성한 hello.c 를 컴파일/링크해봅시다.


$ gcc -o test hello.c
$ test
$


원하는 문자열이 출력되지 않았습니다. -.-


$ ./test
Hello, Linux Girls! =)
$




-c 옵션


어떤 이유로 오로지 컴파일(compile) 작업만 하고 싶은 경우가 있습니다. 그럴 때는 다음과 같이 합니다.


$ gcc -c hello.c
$


그 결과 만들어지는 화일은 전통적으로 hello.c 에서 .c 부분을 떼어내고 .o 를 붙인 화일입니다. 오브젝트 화일, 목적 화일이라고 하지요.

hello.o 라는 화일이 만들어집니다.

여러분은 C 언어로 조금이라도 복잡한 프로그램을 만들기 시작하면 여러 개의 소스로 나누어서 전체 프로그램을 짜게 됩니다. 그럴 때는 각 소스가 전체 기능에 기여하는 특정 기능의 함수들을 가지게 되고 오로지 한 녀석만 main 함수를 가집니다.

만약 어떤 프로그램이 foo.c, bar.c 이렇게 두 개의 소스로 이루어져 있다고 합시다. 이럴 때는 다음과 같이 하는 것이 가능합니다.


방법(1)

$ gcc -o baz foo.c bar.c
$ ./baz


방법(2)

$ gcc -c foo.c
$ gcc -c bar.c

또는

$ gcc -c foo.c bar.c
$ gcc -o baz foo.o bar.o
^^^^^^^^^^^
$ ./baz



위에서 보면 \"아니! C 컴파일러에 .c 즉 소스 화일이 아닌 오브젝트 화일도 막 써주나?\"라는 생각을 하시게 될 겁니다.

그렇습니다! 왜냐? gcc 는 정확히 말해서 C 컴파일러가 아닙니다. gcc 라는 실행 화일 자체는 \"C 컴파일러를 돌리는 녀석\"입니다.

더욱 더 정확히 말해보겠습니다.

C 언어는 기본적으로 두 가지 과정을 거쳐야만 실행화일을 만들어냅니다.


컴파일 ( .c -------> .o )
링크 ( .o -------> 실행화일 a.out )

1. 과정을 실제로 맡는 것은 cc1 이라는 녀석이고 2. 과정을 맡는 것은 ld 라는 링커(linker)입니다.

gcc 는 상당히 편리한 도구로서 .c, .o 등의 화일명 꼬리말을 보고 적절하게 C 컴파일러와 링커를 불러다가 원하는 실행화일을 만들어줍니다. gcc 는 \"컴파일러와 링커를 불러주는 대리인\"입니다.

hello.c 를 괜히 어렵게 컴파일/링크해봅시다 ^^


$ gcc -c hello.c
^^^^^^^
$ gcc -o hello hello.o
^^^^^^^


gcc 가 얼마나 똑똑피한 놈인지 알아보죠.


$ gcc -c hello.o


이게 무슨 의미가 있겠습니까? ^^


gcc: hello.o: linker input file unused since linking not done


위와 같이 불평합니다. 링크 과정을 수행하지 않으므로 링커에 대한 입력 화일인 hello.o 를 사용하지 않았다!


-I 옵션


#include 문장에서 지정한 헤더 화일이 들어있는 곳을 정하는 옵션입니다. 아주 많이 사용되는 옵션 중 하나입니다.



--------------------------------------------------------------------------------

#include
#include \"my_header.h\"


--------------------------------------------------------------------------------


전자( <> 문자를 쓴 경우 )는 시스템 표준 헤더 디렉토리인 /usr/include를 기준으로 화일을 찾아서 포함시킵니다. 표준 디렉토리이지요.

후자( \"\" 문자를 쓴 경우 )는 지금 컴파일러가 실행되고 있는 현재 디렉토리를 기준으로 헤더 화일을 찾습니다.

이 두 디렉토리가 아닌 곳에 대해서는 명시적으로 -I<디렉토리> 로 정해줍니다.


$ gcc -c myprog1.c -I..
$ gcc -c myprog1.c -Iinclude


첫번째는 헤더 화일이 현재 소스 하위 디렉토리(..)에 있다는 뜻이며 두번째는 현재 디렉토리의 include라는 디렉토리에 들어있다는 뜻입니다.

-I 옵션은 얼마든지 여러번 쓸 수 있으며 주어진 순서대로 헤더 화일을 검색합니다.


주의
디렉토리명은 -I 라는 문자 바로 다음에 붙여서 씁니다. 즉 -I <디렉토리>라는 식이 아니라 -I<디렉토리> 입니다. 또한 유닉스에 있어 표준 헤더 화일 디렉토리는 /usr/include 라는 사실을 기억하시기 바랍니다. 또한 리눅스에 있어서는 커널 소스가 아주 중요한데 리눅스 고유의 기능을 쓰는 리눅스용 프로그램의 경우에는 /usr/include/linux, /usr/include/asm, /usr/include/scsi (최신 커널의 경우) 라는 디렉토리가 꼭 있어야 하며 각각은 커널 소스의 헤더 디렉토리에 대한 링크입니다. 따라서 커널 소스를 꼭 설치해두셔야 합니다.


/usr/include/linux --------------> /usr/src/linux/include/linux
/usr/include/asm --------------> /usr/src/linux/include/asm
/usr/include/scsi --------------> /usr/src/linux/include/scsi


( 위에서 /usr/src/linux/include/asm은 사실 대부분의 경우 /usr/src/linux/include/asm-i386 이라는 디렉토리에 대한 링크입니다 )

각각 linux는 일반적인 C 헤더 화일, asm은 각 아키텍쳐별 의존적인 어셈블리 헤더 화일, 맨 마지막은 SCSI 장치 프로그래밍에 쓰이는 헤더 화일이 들어있는 곳입니다.

일반적으로 커널 소스( 약 6 메가 이상되는 소스 )는 /usr/src 에서 tar, gzip으로 풀어두는 것이 관례입니다.

맨 처음 프로그래밍을 할 때는 그렇게 많이 쓰지는 않는 옵션이지만 여러분이 다른 소스를 가져다 컴파일할 때 아주 많이 보게 되는 옵션이므로 일단 이해는 할 수 있어야겠죠?



-l 옵션과 -L 옵션


옵션을 제대로 이해하기에 앞서 ``라이브러리\'\'라는 것에 대한 이야기를 먼 저 하지 않으면 안될 듯 하군요.


라이브러리



--------------------------------------------------------------------------------

``라이브러리(Library)\'\'라는 것은 개념상 영어 단어 그대로입니다.
무엇인가 유용한 지식을 한 곳에 모아둔 곳이라는 개념이지요.

C 프로그래밍을 하다 보면 반복적으로 사용하게 되는 함수들이 있기
마련이고 그것은 하나의 함수로 떼내어 어디에서든 유용하게 사용할
수 있도록 합니다.

이 함수가 극도로 많이 사용되는 경우에는 ``라이브러리\'\'라는 것으
로 만들어두고 매번 컴파일해둘 필요없이 가져다 사용할 수 있도록
하지요.

라이브러리에 대한 얘기는 다음 번에 또 하게 되겠지만 일단 지금
필요한 지식만 쌓기로 하겠습니다.

일반적으로 관례상 라이브러리는 화일명 끝이 .a 로 끝납니다.
여기서 a 는 Archive 라는 의미일 것입니다.

라이브러리의 예를 들어보도록 하죠. 지금 /usr/lib 디렉토리를 한
번 구경해보십시요. 정말로 많은 라이브러리들이 있지요.

libc.a
libm.a
libdb.a
libelf.a
libfl.a
libg++.a
libg.a
libncurses.a
libreadline.a
libvga.a
등등...

이러한 라이브러리는 우리가 컴파일 과정을 거쳐서 만든 .o 화일을
한 곳에 통들어 관리하는 것에 불과합니다. 따라서 archive 를 의미
하는 .a 라고 이름을 짓게 된 것이죠. 라이브러리는 ``도서관\'\'으로
서 그냥 .o 를 무작위로 집어넣은 것은 아니고 당연히 도서관에는
소장하고 있는 책에 대한 목록(index)을 가지듯 포함되어 있는 .o
에 대한 인덱스(index)를 가지고 있습니다.

라이브러리는 다음과 같이 구성되어 있다고 할 수 있는 것입니다.

라이브러리 = 목차(index) + ( a.o + b.o + c.o + ... )

libc.a 를 가지고 한 번 놀아볼까요? 라이브러리 아카이브를 관리하
는 ar 이라는 GNU 유틸리티를 써보겠습니다.

$ cd /usr/lib
$ ar t libc.a
assert-perr.o
assert.o
setenv.o
ftime.o
psignal.o
mkstemp.o
sigint.o
realpath.o
cvt.o
gcvt.o
ctype-extn.o
ctype.o
<등등... 계속>

$ ar t libc.a | grep printf
iofprintf.o
ioprintf.o
iosprintf.o
iovsprintf.o
iovfprintf.o
printf_fp.o
vprintf.o
snprintf.o
vsnprintf.o
asprintf.o
vasprintf.o
printf-prs.o
reg-printf.o
$

위에서 볼 수 있다시피 .o 화일들이 그 안에 들어있습니다.

<주목>
유닉스에서 라이브러리 이름은 lib 로 시작합니다.


--------------------------------------------------------------------------------


간단하게 라이브러리를 하나 만들어서 사용해보도록 합시다.

이번 예제는 3 개의 화일로 이루어졌습니다.


myfunc.h
myfunc.c
hello.c


첫번째 myfunc.h 헤더 화일의 내용입니다.



--------------------------------------------------------------------------------

extern void say_hello ( void );


--------------------------------------------------------------------------------


두번째 myfunc.c, 실제 함수 정의부입니다.



--------------------------------------------------------------------------------

#include
#include \"myfunc.h\"

void
say_hello ( void )
{
printf ( \"Hello, Linux guys!\\n\" );
}


--------------------------------------------------------------------------------


마지막으로 메인 함수(main)가 들어있는 hello.c 입니다.



--------------------------------------------------------------------------------

#include \"myfunc.h\"

int
main ( void )
{
say_hello ();
return 0;
}


--------------------------------------------------------------------------------


main 함수에서 say_hello 라는 함수를 사용하게 됩니다. 이 정도야 그냥 이렇게 해버리고 말죠 ^^


$ gcc -o say_linux hello.c myfunc.c


하지만 라이브러리를 만들어보고 시험해보려고 하는 것이므로 일부러 어렵게 한 번 해보기로 하겠습니다.


$ gcc -c myfunc.c
$ ar r libmylib.a myfunc.o
$ ar s libmylib.a
$ ar t libmylib.a
myfunc.o
$ gcc -o say_linux hello.c -lmylib
^^^^^^^^
ld: cannot open -lmylib: No such file or directory


흠... 처음부터 만만치 않죠? ^^ 실패하긴 했지만 몇 가지를 일단 알아봅시다.


-l 옵션
링크(link)할 라이브러리를 명시해주는 옵션이 바로 -l ( 소문자 L ) 옵션입니다.

-I 옵션과 마찬가지로 바짝 붙여서 씁니다. 절대 떼면 안됩니다.

우리는 libmylib.a 라는 라이브러리를 만들어두었습니다. 그것을 사용하기 위해서는 -lmylib 라고 적어줍니다. 라이브러리 화일명에서 어떤 글자들을 떼내고 쓰는지 주목하십시요.


libmylib.a
^^^^^


앞의 lib 를 떼내고 맨 뒤에 붙는 .a 를 떼냅니다.

링크(link)라는 것이 어떤 것이 모르신다면 당장 C 프로그래밍 책을 다시 읽어보시기 바랍니다. 이 글에서 설명할 범위는 아닌 듯 합니다.



-L 옵션
d 는 유닉스에서 사용되는 링커(Linker)입니다. C 프로그램 컴파일의 맨 마지막 단계를 맡게 되지요.

위에서 우리는 다음과 같은 에러 메세지를 만났습니다.


ld: cannot open -lmylib: No such file or directory


자, 이제 배워야 할 옵션은 ``라이브러리의 위치를 정해주는\'\' -L ( 대문자 L ) 옵션입니다. 사용형식은 -L<디렉토리명> 입니다.

리눅스에서 어떤 라이브러리를 찾을 때는 /lib, /usr/lib, /usr/local/lib와 같은 정해진 장소에서만 찾게 되어 있습니다. 그것은 규칙이지요.

중요한 사실은 아무리 여러분 라이브러리를 현재 작업 디렉토리에 놓아두어도 ld 는 그것을 찾지 않는다는 사실입니다. ld 더러 라이브러리가 있는 장소를 알려주려면 다음과 같이 -L 옵션을 붙이십시요.


$ gcc -o say_linux hello.c -lmylib -L.
^^^


-L. 은 현재 디렉토리에서 라이브러리를 찾으라는 말입니다. -L 옵션은 여러번 줄 수 있습니다.

성공적으로 컴파일되었을 겁니다.


$ ./say_linux
Hello, Linux guys!


지금까지 여러분은 gcc 옵션 중 두번째로 중요한 -I, -l, -L 옵션에 대하여 배우셨습니다. 그리고 또한 라이브러리 만들기에 대하여 맛보기를 하였습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2004/03/19 17:57 2004/03/19 17:57
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/272

C 게시판

C 게시판 입니다.
GCC 도 함께 합니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2004/03/19 17:37 2004/03/19 17:37
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/271

mail , 메일 받는거 안될때~!

mail 이 전송은 되구 안받아질때.

/mail/sendmail.cf

Fw 와 Cw , Alias 를 참조해라... ( 경로 참조 )
alias 경로가 않맞을 수 있다.

sendmail.cw 에 도메인이 들어잇는가?

alias 파일은 /etc/ 에 있다.

샌드메일 리스타트는 각 설정수정할때마다 하구 테스트 해라~!

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2004/03/19 16:59 2004/03/19 16:59
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/181

ln -> 심볼릭 링크 만들기

심볼릭 링크
심볼릭 링크는 주로 디렉토리를 링크할 때 사용한다.

심볼릭 링크는 하나의 파티션을 넘어 다른 영역의 파일까지 링크시킬 수 있다.

n -s 명령으로 링크시키며 생성된 링크 파일은 원래의 파일명을 참조하게 된다. 그래서 원 파일이 삭제되면 실제 데이터 블럭을 참조하던 inode도 삭제되어, 심볼릭 링크된 파일은 의미가 없어진다. 따라서, 심볼릭 링크를 시켰을 때는 원래의 파일이 삭제되지 않도록 주의해야 한다.

아래의 예를 보자.
$ cd
$ ln -s /usr/include include
$ ls -l include
 lrwxrwxrwx  1  unix01 unix  12 mar 11:19 include-> /usr/include
$ cd include
$ pwd
 /usr/include
$ cd
$ who > who.list
$ ln -s who.list who.list.link
$ rm who.list.link
cat : 열 수 없습니다.
$ rm who.list.link

"cat : 열 수 없습니다."라는 error 발생하였다.
cp 명령은 별도의 데이터 블럭을 생성하지만,
n으로 생성된 링크 파일은 원래 파일의 inode를 참조하거나 파일명을 참조할 뿐이며 별도의 데이터 블럭을 생성하는 것은 아니다. 그래서, 공유할 필요가 있는 파일들을 링크하거나 절대경로가 긴 디렉토리를 간편한 이름으로 참조할 경우, 링크를 사용하게 된다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2004/03/16 10:17 2004/03/16 10:17
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/180

C# 13장 클래스 예제

C# 13장 클래스 예제
.
.
.
.
.
.
.
끝~!
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2004/03/12 13:46 2004/03/12 13:46
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/285

« Previous : 1 : ... 82 : 83 : 84 : 85 : 86 : 87 : 88 : 89 : 90 : ... 101 : Next »

블로그 이미지

- 홍반장

Archives

Recent Trackbacks

Calendar

«   2024/11   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Statistics Graph

Site Stats

Total hits:
241563
Today:
93
Yesterday:
1266