initrd & mkinitrd

Posted by 시경이 Study/Linux : 2009/11/11 20:47

출처 : http://linuxqna.com/700

 

1.개 요
커널 컴파일이후에 꼭 필요한 명령 중의 하나가 mkinitrd 명령어 이다.
일반적으로 /boot 밑에 mkinitrd-<kernel version>.img 파일을 만들면서 이 명령어를
쓰게 된다. 하지만 이 mkinitrd에 무엇이 들어가며 무엇이 들어가는지에 대하여
항상 궁금했었다. (나만의 생각인가..ㅠ.ㅠ)
그래서 한번 살펴 보고자 이렇게 글을 써본다.

2.mkinitrd 명령어에 대하여
가. 사용법
일반적으로 사용하는 방법은 아래와 같다.
mkinird <initrd-image> <kernel-version>
* initrd-image : 만들고자 하는 initrd의 파일명
* kernel-version : /lib/modules 밑에 존재하는 커널 버전명을 쳐 준다.

아래는 kernel 2.6.10 버전에 대한 initrd를 생성하는 예를 보여 준 것이다.

[root@test root]# mkinitrd /boot/initrd-2.6.10.img 2.6.10

나. mkinitrd의 옵션

--builtin=module : 모듈이 모듈형태로 동작하는 것이 아니라 커널내부 동작해야
하는 모듈이면 이 옵션을 사용하면 될 것이다.

-f : initrd-image 이름이 이미 존재면 덮어쓰기를 하게 해준다.

--fstab=fstab : 기본적으로 /etc/fstab를 참조하지만 자신이 만든 fstab 파일을
참조하게 만들 때 사용한다.

--preload=module : initrd가 실행할 때 SCSI 모듈이 올라오는 것을 기준으로
SCSI 모듈 전에 실행될 모듈을 지정할 때 사용한다.

--with=module : initrd가 실행할 때 SCSI 모듈이 올라오는 것을 기준으로
SCSI 모듈 후에 실행될 모듈을 지정할 때 사용한다.



3.initrd-<kernel-version>.img의 내용 확인
가. initrd-<kernel-version>.img 마운트 하기

[root@test boot]# file initrd-2.6.10.img
initrd-2.6.10.img: gzip compressed data, from Unix, max compression
/* gzip으로 압축된 것을 알 수 있음. */
[root@test boot]# cp initrd-2.6.10.img initrd-file.gz
[root@test boot]# gunzip initrd-file.gz
/* 압축이 풀리면서 initrd-file로 변경됨 */
[root@test boot]# mkdir initrd-mount
[root@test boot]# file initrd-file
initrd-2.6.10.img: ASCII cpio archive (SVR4 with no CRC)
/* cpio 명령어를 이용하여 파일 및 디렉토리가 압축된 것을 알수 있다. */
/* 2.4대에서는 이 부분에 cpio로 압축이 되어 있지 않아서 mount 옵션으로
마운트를 시켜서 확인할 수 있음 (mount -o loop initrd-file initrd-mount/ ) */
[root@test boot]# cp initrd-file initrd-mount/
[root@test boot]# cd initrd-mount
[root@test initrd-mount]# cpio -idmv < initrd-mount
/* 압축된 디렉토리 및 파일들이 풀리는 것이 보일 것이다. */

[root@test initrd-mount]# tree
// 이 명령어가 없으면 tree rpm 파일을 설치하세요.
.
|-- bin
| |-- hotplug -> /sbin/nash
| |-- insmod
| |-- modprobe -> /sbin/nash
| |-- nash
| |-- udev
| `-- udevstart -> udev
|-- dev
| |-- console
| |-- null
| |-- ram
| |-- systty
| |-- tty1
| |-- tty2
| |-- tty3
| `-- tty4
|-- etc
| `-- udev
| `-- udev.conf
|-- init
|-- lib
| |-- ext3.ko
| |-- jbd.ko
| |-- libata.ko
| |-- sata_nv.ko
| `-- sd_mod.ko
|-- loopfs
|-- proc
|-- sbin -> bin
|-- sys
`-- sysroot


나. initrd내의 트리별 내용
1)init : 이 파일은 nash에 있는 실행 파일로 우리 시스템의 /etc/rc.d/ 밑에 있는
파일들 처럼 최초에 실행되면 어떤 순서로 실행될 지가 정의 되어 있는
스크립트 파일이다. 이 파일이 없으면 linuxrc 파일이 있을 것이다.
[root@test initrd_mount]# file init
init: a /bin/nash script text executable

2) bin 디렉토리
가) insmod : /sbin/insmod.static 부분을 카피해서 가지고 있는 것이다.
최초로 부팅시에는 공유라이브러리를 사용하지 못하기 때문에
라이브러리가 필요없는 static 옵션을 주어 컴파일 한 insmod를 사용하여
필요한 모듈을 올리기 위하여 복사된 것이다.
나) nash : 이 파일은 명령어의 집합체라고 보는 것이 좋을 것이다.
여러가지의 명령어가 심볼릭 링크의 이름으로 동작하게끔 만들어진
명령이다. 쉘 역할을 하면서 몇 가지의 주요 명령어를 이용할 수 있다.
이것 또한 static으로 컴파일 된 것이다.
다) udev : 디바이스 관련 명령어로 어떤 디바이스가 연결되었는지 안되어
있는 지를 확인하여 올려주거나 삭제해 주는 역할을 한다.
/sbin/udev.static가 복사된 것이다.

3) dev 디렉토리
가) console : 시스템 콘솔에 있는 파일이나 디바이스 드라이버를 직접
입출력을 할 수 있도록 제공된 것이다.
나) null : 운영체제를 위하여 제공된 파일이며 null device를 실행하는 역할을
한다.
다) ram : ram 디바이스를 위하여 제공된 파일로 ram에 직접 입출력을
할 수 있게 해준다.
라) tty1~4 : 일반적으로 virtual terminals로 알려진 걸로 시스템으로 부터
올라오는 메세지를 화면상에 뿌려주는 역할을 한다.
마) systty : 키보드나 모니터가 없는 환경에서 심볼릭 링크를 이용하여
디바이스를 사용할 수 있게 해준다. 이것에 대한 자세한 사항은
인터넷 검색하여 사용해 보는 것도 재미있을 것 같다.

4) lib 디렉토리
이 디렉토리는 모듈을 가지고 있는 것을 알 수 있을 것이다. 이 부분에
있는 모듈이 바로 initrd가 올려주는 모듈들이다.

5)나머지 디렉토리
가) proc : procfs의 정보를 마운트 해주는 디렉토리이다.
mount -t proc none proc 를 이용하여 현재 /proc에 있는 내용이랑
동일한 것을 마운트 시킨다.

나) sys : sysfs의 정보를 마운트 해주는 디렉토리이다.
mount -t sysfs none sys 를 이용하여 마운트하며 proc과는 다른 정보를
볼 수 있습니다.

다) loopfs : loop 장치를 마운트하기 위한 디렉토리이다.
losetup 명령어를 이용하여 루프 장치를 정규 파일 또는 블럭 장치와
연결, 루프 장치와 분리, 루프 장치의 상태파악을 위하여 마운트 시켜
디렉토리이다.

라) sysroot : 실제 우리가 사용하는 디스크를 마운트 시켜주기 위한
디렉토리이다. 모든 initrd에서의 설정 내용이 다 실행된 이후에
pivot_root 명령어를 사용하여 우리가 현재 보고 있는 디렉토리를
“/”로 보여주는 것이다.

4.왜 initrd는 램 디스크라고 불리는 것일까?
initrd를 풀어서 안의 내용을 보면 모듈을 올리는데 필요한 것과 시스템에 필요한
정보를 마운트할 파일 시스템을 가지고 있는 것을 볼 수 있다.
하지만 모듈들을 잘 살펴보면 파일 시스템과 관련된 ext3.ko, xfs.ko 파일을 볼 수
있을 것이다. 이것은 파일 시스템이 구동되기 위하여 올라가야 하는 모듈들이다.
그럼, 이 모듈을 올려주는 역할을 하는 initrd는 어떻게 동작하기에 이런 모듈을
파일 시스템이 올라오기도 전에 구동되게 하는 것일까?
이것은 바로 부트로더의 역할 때문이다. 부트로더는 최초에 grub.conf나 lilo.conf에
설정된 디스크의 위치와 디렉토리 위치에서 vmlinuz와 initrd 파일을 램으로 복사하는
역할을 해준다. 이것은 결국 부팅시 사용되는 initrd는 램으로 복사된 initrd를 이용하
여 램상에서 동작을 하는 것이다. 결국 램을 디스크처럼 생각하고 그 곳에 tree에서
본 구조를 그대로 풀어서 init의 설정 내용대로 실행한 이후에 실제 우리가 사용하는
디스크로 넘어와 /sbin/init를 실행하게 된다.
결국 램에서 동작하면서 램을 디스크처럼 이용하기에 램 디스크라고 하는 것이다.

5.mkinitrd 명령어의 역할
가. initrd를 위한 파일 시스템을 구성한다.

나. 부팅시 필요한 모듈을 옮겨준다.
* 2.6 커널 : /etc/modprobe.conf 파일 참조
* 2.4 커널 : /etc/modules.conf 파일 참조
* modprobe.conf내의 usb-controller, scsi_hostadapter를 이용한 모듈만을 넘긴다.
* fstab를 검색하여 파일 시스템에 필요한 모듈을 올려준다.

다. initrd에서 필요한 파일 복사해 준다.

라. initrd에 있는 init를 생성 시켜준다.

* mkinitrd내의 RCFILE를 생성시켜주는 부분을 참조해 주세요..^^

태그 : mkinitrd

리눅스 kill 명령어 사용법

Posted by 시경이 Study/Linux : 2009/09/28 01:38
출처 : http://target2u.blogspot.com/2007/01/kill.html


1. 기능
현재 수행중인 프로세서에게 시그널을 보낸다. 보통 kill 명령은 프로세서를 죽이는 데에 사용된다. 그래서 이 유틸리티의 이름도 kill이 되었다.

2. 문법
# kill [-signalID] PID
# kill -l

3. 옵션-type pattern 형식이 pattern인 것.
-signal ID : 프로세서에게 보낼 시그널을 지정한다. 시그널은 번호로 지정될 수도 있고 시그널 이름으로 지정될 수도 있다.
-l : 시그널 종류를 나열한다. 시그널의 종류는 시그널 번호 순서대로 이름으로 나열한다.

4. 사용방법 및 정보
시그널의 종류를 지정하지 않으면 프로세서를 종료시키는 의미로 디폴트 시그널 ID 15번을 보내게 된다.

예를 들면 당신이 시스템을 사용을 마치고 로그아웃할 때는 시그널 ID 1번의 HUP(hang up) 시그널이 시스템으로 전달되며, 이 시그널은 당신의 셸 상태에서 실행중인 모든 프로세서를 종료시키고(앞에서 언급한 nohup에 의한 프로세서는 제외) 로그아웃하게 한다.

[root@sense root]# kill -l

1) SIGHUP 2) SIGNT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGIOT 7) SIGBUS 8) SIGPPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOL 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR

<shell>
[root@sense ~]# ps aux
root 2209 0.0 0.4 8416 2132 ? Ss Mar17 0:00 cupsd
</shell>

ps 명령을 실행한 결과, 현재 cupsd 데몬이 구동중인 것을 확인할 수가 있고, 이 프로세스에 대한 정보를 확인할 수 있다. 이 중 PID를 이용하여 프로세스를 강제종료 시키고자 한다면 다음과 같은 명령을 실행한다.

<shell>
[root@sense ~]# kill -9 2209
</shell>

위 명령을 실행한 후 ps 명령을 다시 실행하면 cupsd에 대한 정보가 없는 것 확인할 수 있다.

G D B 사용법

Posted by 시경이 Study/Linux : 2007/12/18 15:31
디버거(Debugger)란 프로그램 개발 도구로써, 프로그램을 개발하다가 에러가 발생하면 발생 위치 및 발생이유를 쉽게 찾을 수 있도록 도와 줍니다.

[gdb] 명령 요약
프로그램 실행과 추적(trace)에 관련된 명령들
---------------------------------------------------------
run 현재의 인수를 사용하여 프로그램을 실행
run 새로운 <인수>를 가지고 프로그램을 실행
continue 현재 위치에서 프로그램을 계속 실행시킵니다.break 명령이 작동 된 다음에 사용합니다.
(약자) c, cont
next 한 줄씩 실행 시킵니다. 이 때 함수를 포함하고 있으면 함수를 수행시킵니다. (약자) n
next 줄을 실행 시킵니다.
step 한 줄씩 실행 시킵니다. 이 때 함수를 포함하고 있으면 함수 내부로 들어가서 한 줄씩 실행합니다. (약자) s
step 줄을 실행시킵니다.
break 라인 번호에서 프로그램 실행을 멈추게 합니다.
(dbx) stop at (약자) b
break <함수 명> 함수 내부의 첫번째 라인에서 프로그램의 실행을 멈추게 합니다.
(dbx) stop in <함수명>
quit gdb를 종료 시킵니다.
------------------------------------------------------------

데이타에 관련된 명령들
-----------------------------------------------------------
whatis 지정한 <변수>에 관련된 정보를 보여줍니다.
print 에 지정된 식의 값을 보여줍니다.
(약자) p
display 현재 지정된 display 명령의 목록을 보여줍니다.
list 현재 위치에서 소스 파일의 내용을 10줄 보여줍니다.
list , <시작줄>과 <끝줄>사이의 소스파일 내용을 보여줍니다.
-----------------------------------------------------------

gdb 사용법을 알기 위해서 우선 bug가 있는 프로그램을 작성해보죠.
$ vi bugprogram1.c

---------------< bugprogram1.c 내용>--------------
#include <stdio.h>

int main(void)
{
int i;
double j;
char *bug = NULL;


/* 다음은 i/2 + i 의 값을 출력 시키는 문이다. */
/* i 가 1 이면, j 는 1.5 가 되도록 짠 것이다. */
/* 그러나 실제로 그렇지 않다. */

for( i = 0; i < 5; i++) {
j = i/2 + i;
printf(" j is %lf \n", j );
}

/* 다음은 bug 변수에 hi를 copy하려는 것이다. */
/* 변수명 bug에서 느끼겠지만, 일부려 bug를 만들었다. */
/* 무엇일까 ? */

strcpy(bug,"hi");
printf("bug is %s \n", bug);

return 0;
}
---------------------------------------------


위의 내용을 저장하고 나서,
$ gcc bugprogram1.c -g -o bugprogram1
$ gcc bugprogram1.c -o bugprogram1_g

$ ls -l
total 32
-rwxr-xr-x 1 oprix staff 16375 Apr 5 15:53 bugprogram1*
-rw-r--r-- 1 oprix staff 578 Apr 5 15:52 bugprogram1.c
-rwxr-xr-x 1 oprix staff 11927 Apr 5 15:53 bugprogram1_g*

<설명>------------------
-g option 은 형성된 실행화일을 가지고 debug될 수 있게 compile 해
달라는 일종의 부탁하는 option입니다. gdb를 작동시키려면 이렇게 compile을 해야 합니다.
-g 옵션을 주고 한 것과 안 한 것을 비교하면 -g 옵션을 준게 파일 크기가 큽니다. debug를 위해서
여러 코드가 삽입되고, 실제 소스도 들어가 있습니다.
-o option은 -o 뒤의 화일 이름을 가진 실행화일을 만들어 달라라는 것으로 이 옵션을 생략할 경우에
a.out 이라는 실행파일이 생성됩니다.
위의 bugprogram1.c를 compile하면 error 메세지가 없습니다..
------------------------------------------------------------

$ ./bugprogram1
j is 0.000000
j is 1.000000
j is 3.000000
j is 4.000000
j is 6.000000
Segmentation fault
$

<설명>-----------------------------------------------------
bugprogram1 실행화일을 실행시켰더니 작동되다가 Segmentation fault를 일으키는 군요.
프로그램은 에러없이 컴파일이 잘 되었는데...
어디서 문제가 일어난 걸까요?
-----------------------------------------------------------


$ gdb ./bugprogram1
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(gdb)

--<설명>------------------------------------------------------
프로그램 이름이 bugprogram1이고 현재 디렉토리에 있으니 이렇게 설정합니다.
그냥 쉘에서 gdb를 치시고
(gdb) file ./bugprogram1 이렇게 하는 방법도 있습니다.
편한대로 사용하세요.
-----------------------------------------------------------------

(gdb) list
1 #include < stdio.h >
2
3 int main(void)
4 {
5 int i;
6 double j;
7 char *bug = NULL;
8
9
10 /* 다음은 i/2 + i 의 값을 출력 시키는 문이다. */
(gdb)

--< 설명 > ----------------------------------------------------
list는 소스 내용을 보여줍니다. l 이라고 간단하게 쳐도 작동이 됩니다.
--------------------------------------------------------------

(gdb) l 4,16
4 {
5 int i;
6 double j;
7 char *bug = NULL;
8
9
10 /* 다음은 i/2 + i 의 값을 출력 시키는 문이다. */
11 /* i 가 1 이면, j 는 1.5 가 되도록 짠 것이다. */
12 /* 그러나 실제로 그렇지 않다. */
13
14 for( i = 0; i < 5; i++) {
15 j = i/2 + i;
16 printf(" j is %lf n", j );

--<설명> --------------------------------------------------------
list <첫번째 줄번호>, <끝줄번호>를 치면 위처럼 보입니다.
---------------------------------------------------------------

(gdb) break 14
Breakpoint 1 at 0x804840d: file bugprogram1.c, line 14.
(gdb) run
Starting program: /tmp/gdbproject/bugprogram1

Breakpoint 1, main () at bugprogram1.c:14
14 for( i = 0; i < 5; i++) {

--<설명>-----------------------------------------------------
먼저 가장 의심되는 곳 부터 찾기로 했습니다. for 문이 의심스럽군요.
그래서 for 문의 줄번호인 14에서 break를 걸어두었습니다.
break는 b라는 명령으로 사용할 수 있습니다.
run으로 실행을 시키니 작동되다가 14 줄에서 멈추었습니다.
---------------------------------------------------------------

(gdb) step
15 j = i/2 + i;
(gdb) step
16 printf(" j is %lf n", j );
(gdb) step
j is 0.000000
j is 1.000000
j is 3.000000
j is 4.000000
j is 6.000000

Program received signal SIGSEGV, Segmentation fault.
0x400787a4 in strcpy () at ../sysdeps/generic/strcpy.c:43
43 ../sysdeps/generic/strcpy.c: 그런 파일이나 디렉토리가 없음.

----<설명>----------------------------------------
이런 갑자기 프로그램이 종료가 되었군요.
16 번째 줄 다음에 step을 하면 안 되겠군요. step은 s명령으로도 쓸 수 있습니다.
다시 시작해서 해보죠. 이번에는 15번째 줄에 break를 넣어 보죠.
--------------------------------------------------

(gdb) quit
The program is running. Exit anyway? (y or n) y
$ gdb ./bugprogram1
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(gdb) b 15
Breakpoint 1 at 0x8048420: file bugprogram1.c, line 15.
(gdb) print i
$1 = 0
(gdb) print j
$2 = 4.8699524093964861e-270

----<설명>----------------------------------------
내용을 볼때 print 라는 명령을 사용합니다. 아직 j는 쓰레기 값을 가지고 있군요.
print는 p라는 명령으로도 쓰셔도 됩니다. 계속해 보지요.
--------------------------------------------------

(gdb) s
16 printf(" j is %lf n", j );
(gdb) s
j is 0.000000

Breakpoint 1, main () at bugprogram1.c:15
15 j = i/2 + i;
(gdb) print i
$3 = 1
(gdb) print j
$4 = 0
(gdb) s
16 printf(" j is %lf n", j );
(gdb) print i
$5 = 1
(gdb) print j
$6 = 1
(gdb) s
j is 1.000000

Breakpoint 1, main () at bugprogram1.c:15
15 j = i/2 + i;
(gdb) print i
$7 = 2
(gdb) print j
$8 = 1
(gdb) s
16 printf(" j is %lf n", j );
(gdb) print i
$9 = 2
(gdb) print j
$10 = 3

----<설명>----------------------------------------
자세히 보면 실제로 값이 적용되는 건 그 문장이 실행된다음에 값이 적용되고 있지요.
즉 15번째 문장에서 멈추었으면 15문장은 실행이 안 된 상태입니다. 그 다음에 step 명령이
작동되어야 값이 바뀌지요. 그런데 값을 잘 관찰해 보면 j는 1.0000 이 아니라 1.50000가 될
때도 있어야 되는데 없군요. 계속 정수값을 가지고 있군요.
j = i/2 + i ; 이 부분이 문제가 있군요.
이 부분을 이렇게 수정해 보지요. j = (double)i/2 + (double)i;
--------------------------------------------------

$ gcc bugprogram1.c -g -o bugprogram1
$ gdb ./bugprogram1
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(gdb) b 15
Breakpoint 1 at 0x8048420: file bugprogram1.c, line 15.
(gdb) r
Starting program: /tmp/gdbproject/./bugprogram1

Breakpoint 1, main () at bugprogram1.c:15
15 j = (double)i/2 + (double)i;
(gdb) s
16 printf(" j is %lf n", j );
(gdb) s
j is 0.000000

Breakpoint 1, main () at bugprogram1.c:15
15 j = (double)i/2 + (double)i;
(gdb) s
16 printf(" j is %lf n", j );
(gdb) s
j is 1.500000

----<설명>----------------------------------------
자! 원하는 결과가 나왔지요. 값의 변화를 천천히 추적해서 문제점을 파악하는 방법입니다.
하나의 문제는 해결 되었고 continue 문을 이용해서 break를 나와 보지요.
break 가 15번째 줄에 있었으니 continue 15라고 입력합니다.
--------------------------------------------------

(gdb) continue 15
Will ignore next 14 crossings of breakpoint 1. Continuing.
j is 0.000000
j is 1.500000
j is 3.000000
j is 4.500000
j is 6.000000

Program received signal SIGSEGV, Segmentation fault.
0x400787a4 in strcpy () at ../sysdeps/generic/strcpy.c:43
43 ../sysdeps/generic/strcpy.c: 그런 파일이나 디렉토리가 없음.

----<설명>----------------------------------------
전에 봤던 에러가 나왔군요. 자 이건 어떻게 할까요?
에러 메시지가 strcpy를 가리키고 있으니 strcpy라고 대략 예측을 해보지요.
23번째 줄에 break를 걸어보지요.
에러가 나므로 gdb를 다시 시작해서 break를 겁니다.
--------------------------------------------------


$ gdb ./bugprogram1
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(gdb) b 23
Breakpoint 1 at 0x8048456: file bugprogram1.c, line 23.
(gdb) r
Starting program: /tmp/gdbproject/./bugprogram1
j is 0.000000
j is 1.500000
j is 3.000000
j is 4.500000
j is 6.000000

Breakpoint 1, main () at bugprogram1.c:23
23 strcpy(bug,"hi");
(gdb) p bug
$1 = 0x0
(gdb) p *bug
Cannot access memory at address 0x0.

---<설명>---------------------------------------
음 버그를 찾은 거 같군요. bug의 주소가 0x0인데 여기에 값을 복사하려고
했으니 작동이 안 되는 거지요. 0x0주소는 access 할 수 없는 주소인데..
그래서 프로그램이 제대로 작동하려면 bug에 메모리주소를 할당해주고
사용하면 됩니다.

bug = (char *)calloc(3, sizeof(char));
bug 선언 다음에 이렇게 설정해주면 되겠지요.
--------------------------------------------------------

$ ./bugprogram1
j is 0.000000
j is 1.500000
j is 3.000000
j is 4.500000
j is 6.000000
bug is hi

자 배운 걸 복습해 보세요. break, continue, step, file, print, list ,run


출처 : http://trlight.cafe24.com/tt/index.php?pl=196&PHPSESSID=d06e7a2415886f3eea2807ab4eebae44
태그 : GDB, 디버거

우분투 링크사이트 총 정리

Posted by 시경이 Study/Linux : 2007/07/04 23:33
[http]우분투(Ubuntu)는 데스크탑에서 쉬운 리눅스를 사용할 수 있도록 만들어진 리눅스 배포판입니다. [http]데비안 GNU/Linux를 기반으로 하고 있고, [http]Canonical 사([http]Mark Shuttleworth 소유)의 지원을 받고 있습니다. 우분투라는 이름은 남아프리카 어로 "humanity towards others(공동체 의식에 바탕을 둔 인간애)"를 뜻합니다.

더욱 가까워진 리눅스, 우분투 7.04 (Festy Fawn)
우분투 7.04, feisty fawn 릴리즈!
윈도 사용자가 리눅스(우분투) 맛보기!! WUBI!!
우분투와 수세의 장단점


[공식사이트]
http://www.ubuntu.com/

[한글사이트]
http://www.ubuntu.or.kr/wiki.php

[버젼고르기]
데스크탑: 원도우처럼 사용해 보고싶은분
서버:리눅스 서버 운영이나 공부 하실분
우분투 패키징 안내서 



[다운로드]
공식사이트 : http://www.ubuntu.com/getubuntu/download
우분투 새로운 미러사이트.
우분투(ubuntu) CD
우분투 CD 신청 노하우.
데스크탑버전:공식사이트 : http://www.ubuntu.com/getubuntu/download
서버버젼:공식사이트 : http://www.ubuntu.com/getubuntu/download
네로 프로그램으로 이미지 파일 굽기.

[주의사항]
우분투 live cd로 Win XP 데이타 백업

Ubuntu is available for PC, 64-Bit and Mac architectures.
CDs require at least 256 MB of RAM.
Install requires at least 2 GB of disk space.





[설치하기]
설치가이드 : 우분투 대퍼 설치 가이드
더블 클릭으로 설치하는 유분투 리눅스  
우분투 서버 설치
우분투 데스크탑 설치기
[Ubuntu] Hoary - 우분투 리눅스 설치 가이드
우분투 리눅스 설치 가이드
하드 하나에 우분투 ubuntu 리눅스 linux와 윈도우즈 windows 서버 같이 깔기
우분투 설치하기(그림 첨부)
kt vdsl+ati X850 에서 우분투 제대로 설치하기 
컴팩v3026au에 우분투설치
우분투에서 Grub 부트로더 설치 실패기..ㅡㅡ;;;; 



[설치후]

우분투 데스크탑 설치기 [5] - torrent 클라이언트 Azureus
우분투 데스크탑 설치기 [4] - amule
우분투 데스크탑 설치기 [3] - 엠엔캐스트(mncast.com) 동영상 감상
우분투 데스크탑 설치기 [2] - 동영상 재생
우분투 데스크탑 설치기 [1]

오늘의 삽질 "우분투 & XGL & Veryl & Etc..." 
usb로 우분투 설치 성공기.
우분투 CD로 부팅 
[jwmx]윈도즈 기반의 우분투 사용 및 설치기
우분투와 Vista..
우분투 설치 한후 해야할 것들.. 
우분투 (Ubuntu) 사용하기 
[펌] 데스크탑 OS로의 우분투 간단 사용기
윈도우쟁이가 리눅스 우분투 1달 반 사용기를 남겨봅니다.
우분투 사용기 1 - 멀티 부팅~~!!
우분투 테마를 바꿔보았습니다.. 
우분투 쓰면서 느낀 장, 단점들
우분투 쓸때 제일 짜증나는 것!
우분투(Ubuntu) 6.10 "Edgy" 베타의 간단한 사용기
우분투 대퍼 사용소감!!!



[명령어]
우분투 유용한 명령어 모음
서버버젼 설치 하신분 (초보용) 명령어
종료 명령어
$sudo init 0

재부팅
$sudo init 6


[업그레이드]
우분투 7.04 업그레이드



[설정하기]
유분투(Ubuntu)리눅스 root유저로 로그인하기.. 
초급 - 우분투와 윈도우의 삼바를 이용한 폴더공유
우분투 MIDI 세팅
[펌] 우분투에서 Agere Systems의 ET131x 랜카드 인식 시키기
우분투에서 한영키사용하기
우분투 서버 - 네트워크 설정
우분투에서 RPM 패키지 설치하기.
초급 - 우분투 Raid 잡기 
우분투 feisty 한글 글꼴 문제
우분투에서 사운드가 안나올 때 
우분투 EUC-KR 설치하기
우분투 breezy 설치.
우분투(ubuntu)한영키 설정
우분투 내장랜카드(Marvell Yucon) 설치하기
우분투에서 jre 환경 바꿔주기.
초급 - 우분투 Beryl + Nvidia
우분투 사용시.... 기본 설정들~
우분투 소스 리스트
[펌]우분투에 한글 입력기 설치 리눅스
우분투에서 tftpd-hpa 설정
우분투에서의 한글설정과 바탕화면에 휴지통 등 나타내기 
[펌] 우분투 완전 초보 기본설정법
[우분투] 윈도우 글꼴 사용하기
우분투X60 밝기 조절 Fn+Home, Fn+End
우분투에서 무선 인터넷 설정 밥법입니다..
우분투, ssh에서 한글 깨짐 문제 해결하기
[설치] VMware에 우분투 설치 후 VMware Tools 설치하기
우분투 한글 설정 (nabi)
우분투 캠 사용하기
우분투 공유 폴더(윈도우)
우분투 - 한글입력기 nabi 설치
우분투 엣지 SCIM 설정과 vim 깔기, 그리고 gcc 헤더파일 설치
우분투에서 nvidia의 twinview (dual monitor) 셋팅





[활용하기]
우분투에서 한글2005 설치하기
우분투에서 ipod 사용하기
우분투 7.04 3D Desktop 환경 구성 성공!
우분투 Edgy Eft 설치.
우분투에서 윈도우 접근하기
우분투에서 와콤 타블렛 사용하기
우분투 7.04 에 vmware-server 깔기..
우분투에 XGL을 이용한 Beryl 를 설치하기 위한 문서
우분투 (Ubuntu Feisty) 에서 escript 사용하기
우분투에서 MP3 듣기.......
우분투 서버 - DNS 구축 (bind 설치)
우분투 설치 및 타블렛 설정 
리눅스(우분투 7.04) 에서 네이트온 설치하기...
우분투에 XGL을 이용한 Beryl 를 설치하기 위한 문서
[우분투] 동영상 감상하기
데비안 우분투 OS와 서버(APM) 설치
우분투 서버 - APM, FTP 설치 도우미
우분투 NFS 서버 설치
우분투 엣지 + nvidia-glx + 베릴
우분투 - root 권한 얻기 
우분투 서버 - 호스트네임(hostname) 설정
[우분투] 읽기권한 주고 ntfs 시스템 mount 하기 
비스타가 부럽잖은 우분투+XGL+Beryl 3총사
우분투에 포스트픽스(postfix) 설치
[펌]우분투, Apache+Tomcat+Mysql+php
우분투 네스팟 접속기(dapper drake)
우분투 부트로더 복구 방법
우분투에서 AVR 환경 구성하기... part 1.
우분투에서 동영상 코덱 설치 
우분투에서 소스 컴파일 방법..
우분투에서 GRUB 부트로더가 지워졌을 때
우분투에서 SUN JAVA JVM 사용하기
우분투에서 방화벽(IPTABLES)설정을 통한 인터넷 공유
우분투 코덱 설치 프로그램
우분투(ubuntu) BIND - DNS 도메인 등록 
우분투에서 telnetd 설치가 안될경우?
우분투 postgresql 설정 - ubuntu 5.10 


[우분투 지식인] 묻고 답하기


자료출처 : http://myblogging.tistory.com/entry/마이로그-리눅스-유분투우분투ubuntu-총정리

태그 : Ubuntu Linux

우분투 루트계정 만들기

Posted by 시경이 Study/Linux : 2007/07/04 23:28

http://blog.naver.com/rigobert/20033743857

원래 우분투 리눅스는 root (관리자 계정)로 로그인할 수 없습니다. 설치할 때 사용자 ID를 root 로 정하면 로그인이 아예 불가능하게 됩니다. 다음은 우분투에 root 계정과 암호를 만들어 주는 방법입니다. 프롬프트에서

sudo passwd root
라고 합니다. 주의! 위에서 "passwd"라는 문자열은 진짜 암호가 아니라 문자 그대로 입력해야 합니다.
만약 패스워드가 foo 라고 해서
sudo foo root
이렇게 하면 안됩니다. 정확히 sudo passwd root 이렇게 적어 주어야 합니다.
그러면 현재 암호를 먼저 묻습니다. 현재 로그인한 ID의 암호를 한번 입력해 주면 이제
Enter new UNIX password:
라고 나오며 root 의 암호를 2번 묻습니다. 새 암호를 만들어 적어 주면 됩니다.
그러면 이제 root 로 로그인할 수 있습니다. root 계정이 생기는 것입니다.
Ctrl+D키를 눌러, 로그아웃한 후 root 로 로그인해 봅니다


make 만들기

Posted by 시경이 Study/Linux : 2007/07/04 22:44

3. make 강좌

3.1 머릿말

소스 한두 개로 이루어진 C/C++ 언어 교양과목 과제물을 제출하는 것이 아니라면 약간만 프로젝트가 커져도 소스는 감당할 수 없을 정도로 불어나게 되고 그것을 일일이 gcc 명령행 방식으로 처리한다는 것은 상당히 곤역스러운 일입니다.

그래서 하나의 프로젝트를 효율적으로 관리하고 일관성있게 관리하기 위하여 Makefile 이라는 형식을 사용하고 make 라는 유틸리티를 사용합니다.

여러분이 리눅스에서 소스 형태로 되어 있는 것을 가져와서 컴파일하게 되면 보통 마지막에는 make 라는 명령, 또는 make <어쩌구> 이런 식으로 치게 됩니다.

make 라는 유틸리티는 보통 현재 디렉토리에 Makefile 또는 makefile 이라는 일정한 규칙을 준수하여 만든 화일의 내용을 읽어서 목표 화일(target)을 만들어냅니다. Makefile의 이름을 다르게 명시하고 싶을 때는 다음과 같이 합니다.

        $ make -f Makefile.linux

보통 멀티플랫폼용 소스들은 Makefile.solaris, Makefile.freebsd, Makefile.hp 이런 식으로 Makefile 을 여러 개 만들어두는 경향이 있지요. 또는 적절하게 만들어두어 다음과 같이 make <플랫폼> 라는 식으로 하면 컴파일되도록 하기도 합니다.

        $ make linux

이런 일은 보통의 관례일 뿐이죠. 더 예를 들어보자면 이런 식입니다. 우리가 커널 컴파일 작업할 때를 보십시요.

        $ make config           /* 설정 작업을 한다 */
        $ make dep              /* 화일 의존성을 검사한다 */
        $ make clean            /* 만든 화일들을 지우고 
                                   깨긋한 상태로 만든다 */
        $ make zImage           /* zImage(압축커널)를 만든다 */
        $ make zlilo            /* 커널을 만들고 LILO를 설정한다 */
        $ make bzImage          /* bzImage(비대압축커널)를 만든다 */
        $ make modules          /* 커널 모듈을 만든다 */
        $ make modules_install  /* 커널 모듈을 인스톨한다 */

복잡한 것같아도 우리는 항상 make, make, make ... 일관성있게 make 라고만 쳐주면 됩니다. ^^ 분량이 작은 소스들의 경우에는 일반적으로 다음만 해도 되는 경우가 많죠.

        $ make  또는 make all
        $ make install

영어권에 사는 사람들에게는 더욱 친밀하게 느껴질 겁니다. 그렇겠죠? ``만들라!''라는 동사를 사용하고 있는 것이고 그 다음에는 그들의 정상적인 어순에 따라 목적어가 나오죠.

        $ make install.man

또한 관례상 ``맨페이지'' 같은 것은 별도로 인스톨하도록 배려하는 경우가 많습니다. 프로그램에 대해 잘 아는 사람이라면 맨페이지를 자질구레하게 설치하고 싶지 않을 때도 많으니까요.

다른 사람에게 공개하는 소스라면 더욱 make 를 사용해야 합니다. 그들뿐 아니라 여러분 자신도 make 라고만 치면 원하는 결과가 나올 수 있도록 하는 것이 좋습니다. 많은 소스를 작성하다 보면 여러분 스스로도 까먹기 쉽상입니다.

일단 make를 사용하는 일반적인 관례를 익히는 것이 중요하다고 봅니다. 리눅스 배포판 패키지만 설치하지 마시고 적극적으로 소스를 가져다 컴파일해보십시요. 실력이든 꽁수든 늘기 시작하면 여러분은 더욱 행복해지실 수 있습니다. =)

3.2 make 시작해 봅시다.

일관성있게 make라고만 치면 모든 일이 술술 풀려나가도록 하는 마술은 Makefile이라는 것을 어떻게 여러분이 잘 만들어두는가에 따라 결정됩니다. 바로 이 Makefile 을 어떻게 만드는지에 대하여 오늘 알아봅니다.

상황 1)

        $ gcc -o foo foo.c bar.c

여기서 foo 라는 실행화일은 foo.c, bar.c 라는 2 개의 소스로부터 만들어지고 있습니다.

여러분이 지금 계속 코딩을 하고 있는 중이라면 이 정도쯤이야 가상콘솔 또는 X 터미널을 여러 개 열어두고 편집하면서 쉘의 히스토리 기능을 사용하면 그만이지만 하루 이틀 계속 해간다고 하면 곤역스러운 일이 아닐 수 없습니다.

자, 실전으로 들어가버리겠습니다. vi Makefile 해서 만들어봅시다. ( 편집기는 여러분 마음 )


 foo:   foo.o bar.o 
        gcc -o foo foo.o bar.o

 foo.o: foo.c
        gcc -c foo.c

 bar.o: bar.c
        gcc -c bar.c

입력하는데 주의하실 것이 있습니다. 자, 위 화일을 보십시요. 형식은 다음과 같습니다.


 목표:  목표를 만드는데 필요한 구성요소들...
        목표를 달성하기 위한 명령 1
        목표를 달성하기 위한 명령 2
        ...

Makefile은 조금만 실수해도 일을 망치게 됩니다.

맨 첫번째 목표인 foo 를 살펴보죠. 맨 첫 칸에 foo: 라고 입력하고 나서 foo가 만들어지기 위해서 필요한 구성요소를 적어줍니다. foo가 만들어지기 위해서는 컴파일된 foo.o, bar.o 가 필요합니다. 각 요소를 구분하는데 있어 콤마(,) 같은 건 사용하지 않고 공백으로 합니다.

중요! 중요! 그 다음 줄로 넘어가서는 <탭>키를 누릅니다. 꼭 한 번 이상은 눌러야 합니다. 절대 스페이스키나 다른 키는 사용해선 안됩니다. 목표 화일을 만들어내기 위한 명령에 해당하는 줄들은 모두 <탭>키로 시작해야 합니다. Makefile 만들기에서 제일 중요한 내용입니다. <탭>키를 사용해야 한다는 사실, 바로 이것이 중요한 사실입니다.

foo를 만들기 위한 명령은 바로 gcc -o foo foo.o bar.o 입니다.

다시 한 번 해석하면 이렇습니다. foo 를 만들기 위해서는 foo.o와 bar.o가 우선 필요하다.( foo: foo.o bar.o )

일단 foo.o, bar.o 가 만들어져 있다면 우리는 gcc -o foo foo.o bar.o 를 실행하여 foo 를 만든다.

자, 이제부터 사슬처럼 엮어나가는 일만 남았습니다.

foo를 만들려고 하니 foo.o와 bar.o 가 필요합니다!

그렇다면 foo.o는 어떻게 만들죠?


 
 foo.o: foo.c
        gcc -c foo.c

바로 이 부분입니다. foo.o는 foo.c를 필요로 하며 만드는 방법은 gcc -c foo.c입니다.

그 다음 bar.o 는 어떻게 만들죠?


 bar.o: bar.c
        gcc -c bar.c

이것을 만들려면 이것이 필요하고 그것을 만들기 위해서는 또 이것이 필요하고...

소스를 만들어서 해봅시다.

  • foo.c 의 내용

extern void bar ( void );

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

  • bar.c 의 내용

#include <stdio.h>

void
bar ( void )
{
  printf ( "Good bye, my love.\n" );
}

Makefile을 위처럼 만들어두고 그냥 해보죠.

        $ make 또는 make foo
        gcc -c foo.c
        gcc -c bar.c
        gcc -o foo foo.o bar.o

명령이 실행되는 순서를 잘 보십시요. 여기서 감이 와야 합니다. ^^

        $ ./foo
        Good bye, my love.

다시 한 번 실행해볼까요?

        $ make
        make: `foo' is up to date.

똑똑한 make는 foo를 다시 만들 필요가 없다고 생각하고 더 이상 처리하지 않습니다.

이번에는 foo.c 를 약간만 고쳐봅시다. return 0; 라는 문장을 exit (0); 라는문장으로 바꾸어보죠. 그리고 다시 한 번 다음과 같이 합니다.

        $ make
        gcc -c foo.c
        gcc -o foo foo.o bar.o

자, 우리가 원하던 결과입니다. 당연히 foo.c 만 변화되었으므로 foo.o 를 만들고 foo.o가 갱신되었으므로 foo도 다시 만듭니다. 하지만 bar.c는 아무변화를 겪지 않았으므로 이미 만들어둔 bar.o 는 그대로 둡니다.

소스크기가 늘면 늘수록 이처럼 똑똑한 처리가 필요하지요.

        $ rm -f foo
        $ make
        gcc -o foo foo.o bar.o

이것도 우리가 원하던 결과입니다. foo 실행화일만 살짝 지웠더니 make는 알아서 이미 있는 foo.o, bar.o 를 가지고 foo 를 만들어냅니다. :)

상황 2) 재미를 들였다면 이번에는 청소작업을 해보기로 합시다.


 clean:
        rm -f foo foo.o bar.o

이 두 줄을 위에서 만든 Makefile 뒷부분에 추가해보도록 합시다.

        $ make clean
        rm -f foo foo.o bar.o
        $ make
        gcc -c foo.c
        gcc -c bar.c
        gcc -o foo foo.o bar.o

make clean이라는 작업 또한 중요한 작업입니다. 확실히 청소를 보장해주어야 하거든요.

make, make clean 이런 것이 되면 상당히 멋진 Makefile 이라고 볼 수 있죠? 이번 clean 에서 보여드리고자 하는 부분은 이런 것입니다.

우리의 머리 속에 clean 이라는 목표는 단지 화일들을 지우는 일입니다.

clean: 옆에 아무런 연관 화일들이 없지요?

그리고 오로지 rm -f foo foo.o bar.o 라는 명령만 있을 뿐입니다. clean이라는 목표를 수행하기 위해 필요한 것은 없습니다. 그러므로 적지 않았으며 타당한 make 문법입니다.

상황 3)


 all: foo

이 한 줄을 Makefile 맨 앞에 넣어두도록 합시다.

        $ make clean
        $ make all
        gcc -c foo.c
        gcc -c bar.c
        gcc -o foo foo.o bar.o

이번예는 all 이라는 목표에 그 밑에 나오는 다른 목표만이 들어있을 뿐, 아무런 명령도 없는 경우입니다. 보통 우리는 make all 하면 관련된 모든 것들이 만들어지길 원합니다.

 all: foo1 foo2 foo3
 foo1: <생략>
 foo2: <생략>
 foo3: <생략>

이런 식으로 해두면 어떤 장점이 있는지 알아봅시다.

보통 make all 하면 foo1, foo2, foo3가 모두 만들어집니다. 그런데 어떤 경우에는 foo1만 또는 foo2만을 만들고 싶을 때도 있을 겁니다. 괜히 필요없는 foo3 같은 것을 컴파일하느라 시간을 보내기 싫으므로 우리는 단지 다음과 같이만 할 겁니다.

        $ make foo1
        $ make foo2

물론 일반적으로 다 만들고 싶을 때는 make all 이라고만 하면 됩니다.

make all 이건 아주 일반적인 관례이지요. 그리고 외우기도 쉽잖아요?

3.3 꼬리말 규칙, 패턴 규칙

잘 관찰해보시면 어쩌구.c -----------> 어쩌구.o 라는 관계가 매번 등장함을 알 수 있습니다. 이것을 매번 반복한다는 것은 소스 화일이 한 두 개 정도일 때야 모르지만 수십 개가 넘게 되면 정말 곤역스러운 일이라고 하지 않을 수 없지요.

다음과 같은 표현을 Makefile 에서 보는 경우가 많을 겁니다.


 .c.o:
        gcc -c ${CFLAGS} $<

여기서 .c.o 의 의미를 생각해보겠습니다. ".c 를 입력화일로 받고 .o 화일을 만든다"

        gcc -c ${CFLAGS} $<

이 문자을 보면 일단 눈에 띄는 것은 ${CFLAGS}라는 표현과 $< 라는 암호와도 같은 표현입니다. 여기서는 일단 $< 라는 기호의 의미를 알아보겠습니다.

유닉스에서 쉘을 잘 구사하시는 분들은 눈치채셨을 겁니다. 작다 표시(<)는 리다이렉션에서 입력을 의미하는 것을 아십니까? 그렇다면 $< 는 바로 .c.o 라는 표현에서 .c 즉 C 소스 화일을 의미합니다.

예를 들어 foo.c 가 있다면 자동으로

        gcc -c ${CFLAGS} foo.c

가 수행되며 gcc 에 -c 옵션이 붙었으므로 foo.o 화일이 만들어질 것입니다.

3.4 GNU make 확장 기능

.c.o 라는 전통적인 표현 말고 GNU 버전( 우리가 리눅스에서 사용하는 것은 바로 이것입니다 )의 make 에서 사용하는 방법을 알아봅시다.

위에서 예로 든 것을 GNU 버전의 make 에서 지원하는 확장문법을 사용하면 다음과 같습니다.


 %.o: %.c
        gcc -c -o $@ ${CFLAGS} $<

그냥 설명 전에 잘 살펴보시기 바랍니다.

우리가 위에서 알아보았던 표준적인 .c.o 라는 꼬리말 규칙(Suffix rule)보다 훨씬 논리적이라는 것을 발견하셨습니까?

우리가 바로 전 강의에서 main.o : main.c 이런 식으로 표현한 것과 같은 맥락이지요? 이것을 우리는 패턴 규칙(Pattern rule)이라고 부릅니다. 콜론(:) 오른쪽이 입력 화일이고 왼쪽이 목표 화일입니다. 화일명 대신 퍼센트(%) 문자를 사용한 것만 유의하면 됩니다. 여기서 foo.c 라는 입력화일이 있다면 % 기호는 foo 만을 나타냅니다.

        gcc -c -o $@ ${CFLAGS} $<

라는 표현을 해석해봅시다. ( 후  마치 고대 문자판을 해석하는 기분이 안드십니까? ^^ )

$< 는 입력화일을 의미하고 $@ 은 출력화일을 의미합니다. .c.o와 같은 꼬리말 규칙과 별 다를 바 없다고 생각하실 지 모르나 -o $@ 를 통하여 .o 라는 이름 말고 전혀 다른 일도 해낼 수 있습니다.

다음 예는 그냥 이런 예가 있다는 것만 한 번 보아두시기 바랍니다.


 %_dbg.o: %.c
        gcc -c -g -o $@ ${CFLAG} $<

 DEBUG_OBJECTS = main_dbg.o edit_dbg.o

 edimh_dbg: $(DEBUG_OBJECTS)
        gcc -o $@ $(DEBUG_OBJECTS)

%_dbg.o 라는 표현을 잘 보십시요. foobar.c 라는 입력화일(%.c)이 있다면 % 기호는 foobar 를 가리키므로 %_dbg.o 는 결국 foobar_dbg.o 가 됩니다.

기호정리

 $<     입력 화일을 의미합니다. 콜론의 오른쪽에 오는 패턴을 치환합니다.
 $@     출력 화일을 의미합니다. 콜론의 왼쪽에 오는 패턴을 치환합니다.
 $*     입력 화일에서 꼬리말(.c, .s 등)을 떼넨 화일명을 나타냅니다.

역시 GNU 버전이라는 생각이 들지 않으시는지요?

3.5 매크로(Macro) 기능

앞에서도 잠깐씩 나온 ${CFLAGS} 라는 표현을 보도록 합시다.

gcc 옵션도 많이 알고 make을 능수능란하게 다룰 수 있는 사람들은 다음과 같이 해서 자신의 프로그램에 딱 맞는 gcc 옵션이 무엇인지 알아내려고 할 것입니다.

 $ make CFLAGS="-O4"
 $ make CFLAGS="-g"

이제 매크로에 대한 이야기를 나눠볼까 합니다. 이 이야기를 조금 해야만 위의 예를 이해할 수 있다고 보기 때문입니다. 그냥 시험삼아 해보십시다. 새로운 것을 배우기 위해서는 꼭 어떤 댓가가 와야만 한다는 생각을 버려야겠지요?


 myprog: main.o foo.o
        gcc -o $@ main.o foo.o

이것을 괜히 어렵게 매크로를 이용하여 표현해보기로 하겠습니다.


 OBJECTS = main.o foo.o
 myprog: $(OBJECTS)
        gcc -o $@ $(OBJECTS)

여러분은 보통 긴 Makefile을 훔쳐 볼 때 이런 매크로가 엄청나게 많다는 것을 보신 적이 있을 겁니다. ^^


 ROOT = /usr/local
 HEADERS = $(ROOT)/include
 SOURCES = $(ROOT)/src

예상하시듯 위에서 HEADERS는 당연히 /usr/local/include가 되겠지요?

다음과 같은 문장도 있습니다.


 ifdef XPM
     LINK_DEF = -DXPM
 endif

  $ make XPM=yes

이렇게 하면 ifdef   endif 부분이 처리됩니다.

자, make CFLAGS="-O" 이런 명령을 한 번 봅시다. ${CFLAGS}에서 {} 표현은 유닉스 쉘에서 변수값을 알아낼 때 쓰는 표현입니다. CFLAGS 값을 여러분이 Makefile에 고정적으로 집어넣지 않고 그냥 make 만 실행하는 사람에게 선택권을 주기 위해서 사용하거나 자기 스스로 어떤 옵션이 제일 잘 맞는지 알아보기 위해서 사용합니다. 다른 옵션으로 컴파일하는 것마다 일일이 다른 Makefile을 만들지 말고 가변적인 부분을 변수화하는 것이 좋습니다.

3.6 마지막 주의 사항


 target:
        cd obj
        HOST_DIR=/home/e 
        mv *.o $HOST_DIR

하나의 목표에 대하여 여러 명령을 쓰면 예기치 않은 일이 벌어집니다. 기술적으로 말하자면 각 명령은 각자의 서브쉘에서 실행되므로 전혀 연관이 없습니다. -.- cd obj 도 하나의 쉘에서 HOST_DIR=/home/e도 하나의 쉘에서 나머지도 마찬가지입니다. 각기 다른 쉘에서 작업한 것처럼 되므로 cd obj 했다 하더라도 다음번 명령의 위치는 obj 디렉토리가 아니라 그대로 변함이 없이 현재 디렉토리입니다. 세번째 명령에서 HOST_DIR 변수를 찾으려 하지만 두번째 명령이 종료한 후 HOST_DIR 변수는 사라집니다.


 target:
        cd obj ; \
        HOST_DIR=/hom/e ; \
        mv *.o $$HOST_DIR

이렇게 적어주셔야 합니다. 세미콜론으로 각 명령을 구분하지요. 처음 두 줄의 마지막에 쓰인 역슬래쉬(\) 문자는 한 줄에 쓸 것을 여러 줄로 나누어 쓴다는 것을 나타내고 있습니다.

주의! 세번째 줄에 $HOST_DIR이 아니라 $$HOST_DIR인 것을 명심하십시요. 예를 하나 들어보죠. ^^


 all:
         HELLO="안녕하세요?";\
         echo $HELLO

Makefile의 내용을 이렇게 간단하게 만듭니다.

 $ make
 HELLO="안녕하세요?";\
 echo ELLO
 ELLO
<verb>

 우리가 원하는 결과가 아니죠?

 $HELLO를 $$HELLO로 바꾸어보십시요.

<verb>
 $ make
 HELLO="안녕하세요?";\
 echo $HELLO
 안녕하세요?


 all:
         @HELLO="안녕하세요?"; echo $$HELLO

명령의 맨 처음에 @ 문자를 붙여봅시다.

 $ make
 안녕하세요?

3.7 잠시 마치면서

Makefile에 대한 내용은 이것보다 훨씬 내용이 많습니다. 하지만 모든 것을 다 알고 시작할 수는 없겠지요? 이 정도면 어느 정도 충분하게 창피하지 않을 정도의 Makefile을 만들 수 있습니다.

참고로 autoconf/automake라고 하는 아주 훌륭한 GNU make 유틸리티를 시간나면 배워보시는 것도 좋습니다.

시간을 내서 리눅스에서의 C 프로그래밍에 필요한 다른 여러 가지 유틸리티들( 간접적이든 직접적이든 grep, awk, rcs, cvs 등 )의 간단/실전 사용법도 올려드릴까 생각 중입니다. ^^

태그 : make

ubuntu 헤더 파일 설치

Posted by 시경이 Study/Linux : 2007/07/04 22:25

sudo apt-get install build-essential

- 끝 -

태그 : ubuntu 헤더

한글폰트 등록하기

Posted by 시경이 Study/Linux : 2007/07/04 22:24
윈도우 폴더/fonts/라는 데서 필요한 코드 가져옴.

/usr/share/truetype 에 넣어주고

sudo fc-cache -fv <-- reflesh 하는것 같음.
태그 : 한글폰트

우분투 완전 초보 기본설정법

Posted by 시경이 Study/Linux : 2007/07/04 22:01


출처 블로그 > 저늬진 블로그
원본 http://blog.naver.com/euijin0602/10008919811
우분투 완전 초보 기본설정법.

설치후 업데이트까지 마친후 설정한다. (꼭 안그래되 된다 ^^;)
설치방법은 생략.
업데이트는 꽤 오래걸린다  (속도잘뜨는 시간대에 하면 좋을것.)
2006.08.31 현재 설치후 약 160개정도의 업데이트가 있다.

이글의 대상은 나와같은 리눅스를 아주살짝아는 초보를 대상으로 작성하였다.
기본적으로 리눅스 간단한 명령은 사용할줄 알면 더욱좋다
(cp,mv,cd등의 간단한 명령어만 알면 이해 할수 있는 내용들이다.)
혹시 고수들이 본다면 약간은 좀 틀린부분도 있을지 모른다.
지적해주면 수정하도록 하겠다.
특별이 아래 방법이 정석인것들은 아닐수있으며 본인이 이것저것 만지고 여러 웹사이트들을 검색하여 편집하였다.
파일들은 편집하기전 만약의 사태를 위한 백업정도는 해두자.

혹시 제시되어있는 명령들이 실행이 안된다면 오타일수 있으니 자동완성기능과 아래 싸이트들을
참고하여 설정하기바란다
(자동완성: 만약 터미널에서 /usr/lib 폴더로 이동할때 전부 타이핑할것없이 /us 까지만치고 탭키를 누르면 조건에 맞는 폴더나 파일들이 자동으로 완성된다.)
우분투는 루트기능을 sudo 명령으로 수행한다
.

우분투 사용자 모임과 데비안사용자모임에서 발췌 편집했다
http://www.ubuntu.or.kr/wiki.php
http://www.debianusers.org/

시작


* 일단 나중에 설치될 프로그램들을 위해 아래 소스를 소스리스트에 추가한다.
sudo gedit /etc/apt/sources.list   <--터미널에 요명령 그대로 친다.

deb http://packages.freecontrib.org/ubuntu/plf dapper free non-free
deb http://archive.ubuntu.com/ubuntu/ dapper main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ dapper main restricted universe multiverse
deb http://wine.budgetdedicated.com/apt dapper main

위 소스를 복사후 붙여넣고 저장한다.
(mplayer,w32codec,wine을 설치할수있다)

sudo apt-get update 명령실행


1.해상도 및 nvidia 드라이버설치 (3D 가속기능)
우분투 초기 설치하시 본인은 기본해상도가 800x600만 사용가능했다.


#ATI 는 https://help.ubuntu.com/ubuntu/desktopguide/ko/hardware.html
#페이지를 조금 읽어내려가면 설정하는 법이 나온다. 본인은 ATI가 아니어서 직접해보진 못했다
#우분투 사용자 모임에서 검색하여도 필요한 정보가 나올것임.

가지고 있는 비디오 카드가 오래된 TNT, TNT2, TNT Ultra, GeForce1 , GeForce2 card 등의 비디오 카드라면 nvidia-glx-legacynvidia-settings 꾸러미를 설치한다

위 이상의 그래픽카드라면 nvidia-glx 만설치.
본인은 지포스4 mx440 이므로 glx설치.

sudo apt-get install nvidia-glx 실행

새로운 드라이버를 이용가능하게 하려면 터미널에서 다음의 명령어를 실행하십시오:
sudo nvidia-glx-config enable

nvidia-settings 명령으로 필요한 설정할수있다
(본인은 몰라서 기냥 내버려뒀음)
glxinfo | grep rendering 명령후
direct rendering: Yes
라고 나오면 3D 가속기능 활성화됨


sudo gedit /etc/X11/xorg.conf 명령으로 xorg.conf 편집해서 해상도를 설정해준다.
(원하는 해상도를 바로 사용할수있다면 패스)
중간쯤보면 nv라고 써저있는 보분이있다. 그것을 nvidia 로 바꿔줌
끝에쯤보면 800x600 등 해상도가 써져있는 부분이있다
그중  24 라고 써져있는 부분아래에 원하는 해상도를 추가한다

Depth        24
        Modes        "1280x1024" "1024x768" "800x600" "640x480" 이런식으로

재부팅하면 원하는 해상도 사용가능.
재부팅시 제대로 되었으면 nvidia 로고가 뜬다. 이로고는 삭제할수있다.
사용자 문서참고 (우분투 사용자 모임 홈페이지)
본인은 17인치 CRT모니터에 엔비디아 MX440 이다.


2. 한글환경

한영키 사용하기. (한영키를 바로사용할 수 있다면 패스~)

우분투 설치기 기본으로 설치되는 한글입력기 scim 의 성능에 만족하기때문에 따로 nabi로 바꾸지않고 그냥 scim을 사용한다.
한영키가 사용안된다면 기본 한영전환기는 컨트롤 + 스페이스바

터미널에서 xev 명령을 실행
한영키와 한자버튼을 눌러서 키값이 몇으로 나오는지 기억해둔다
본인은 한영은 210 한자는 209 였다

터미널에서 아래명령을 차례 차례 실행해본다.
 sudo setkeycodes 71 122
sudo setkeycodes 72 123
xmodmap -e "keycode 210 = Hangul" (여기서 210은 xev 샐행후 나온 자신의 키값을 넣는다)
xmodmap -e "keycode 209 = Hangul_Hanja" (여기도 마찬가지)
이명령으로 현재 상태에서 한영,한자키가 사용가능하다.
이제 다시시작해도 사용가능하게 해보자.

우분투사용자 모임 zzz 님께서 알려주신  편한방법 (랩탑,데스크탑모두 가능)

sudo gedit /usr/share/xmodmap/xmodmap.kr  라고 터미널에 명령준 다음

keycode xxx = Hangul_Hanja             
keycode xxx = Hangul                      

xxx 부분을 xev로 한/영키와 한자키에 대한 코드값을 알아내어 알맞게 바꿉니다.

키보드 지정
그리고는 시스템 > 기본 설정 > 키보드 > 키 배치 에서
(더하기 눌러서 Korea, Republic of 추가후)
Korea, Republic of 맨 위로 올리고 체크합니다.

재부팅후 사용가능
이방법이 xmodmap.kr에 키 배치가 들어있는 것으로 보아 정석적인 방법 같다.

혹시나 위 방법이 안되면 사용자문서에 있는 방법으로 해보자
.

http://www.ubuntu.or.kr/wiki.php/%ED%95%9C%EC%98%81%ED%82%A4

위 링크를 따라하고 재부팅하기전에 만들어놓은 ~/.Xmodmap 파일에 실행퍼미션을 준다.
chmod 755 ~/.Xmodmap
재부팅~
이래도 안되면 .Xmodmap 파일을
xmodmap -e "keycode xxx = Hangul"
xmodmap -e "keycode xxx = Hangul_Hanja" (xxx는 xev로 알아낸 키값)
이렇게 작성해 보아라



윈도우 굴림체 사용하기

우분투는 설치되면 기본적으로 윈도우파티션을 마운트해준다.
(usb도 꽂으면 자동으로 마운트 해준다.)

/media/hda1/WINDOWS/Fonts/gulim.ttc  파일을 복사해온다.
(hda1은 윈도우가 설치된 파티션이다. 본인에 맞는 파티션에서 복사해오길)

/usr/share/fonts/ 폴더에 붙여넣는다
sudo chmod 644 /usr/share/fonts/gulim.ttc 명령으로 퍼미션을 바꿔준다.
(퍼미션을 안바꿔주면 x윈도우로 실행이 안된다. 644퍼미션으로도 x가 실행안되면 755로)

#실수로 퍼미션을 안줘서 X가 부팅이 안된다면
#컨트롤 + 알트 + F1(F1~F6 사이 아무거나) 누른다.
#로그인하고  (화면이 몇번깜빡거릴것이다. 퍼런화면도 뜨고.. 대충 엔터누른다)
#sudo chmod 644 나 755 /usr/share/fonts/gulim.ttc (윈도굴림설치된폴더와 파일)
#명령으로 퍼미션을 주고
#sudo reboot 으로 재부팅하면 X가 뜰것이다.

sudo fc-cache 명령실행.

sudo rm /etc/fonts/language-selector.conf 명령으로 파일삭제
sudo ln -s /usr/share/language-selector/fontconfig/ko_KR /etc/fonts/language-selector.conf
명령으로 링크를 바꿔줌
(/etc/fonts/language-selector.conf 파일의 기본링크가 none으로 되어있었다)

이렇게만 해줘도 윈도우굴림은 아니지만 은폰트로 비교적 깔끔한 글꼴사용이 가능하다.
윈도우 굴림에 익숙한 분들을 위하여 약간의 편집으로 윈도우 글꼴을 사용하자.

sudo gedit  /usr/share/language-selector/fontconfig/ko_KR  명령으로 ko_KR파일을 편집한다.
아랫쪽에 보면 Unbatang 한부분 과 Undotum 두분이 있을것이다
이부분들을 Gulim 으로 바꿔준다.
Undotum 두부분 바로아랫부분에보면 Eunguseul 이란부분도 Gulim 으로 바꾼다.

시스템-기본설정-글꼴설정에서 굴림으로 바꾸어주면 끝
파폭역시 편집-환경설정에서 굴림으로바꾸어준다. 고급을 눌러서 모두 굴림으로 바꾸고
표시해상도는 시스템설정으로 해주면 깔끔한 윈도우 굴림을 사용할수있다.

혹시몰라 ko_KR 파일을 첨부한다.
기타 다른 윈도우 폰트의 사용은 윈도우 폰트를 /usr/share/fonts 에 복사하고
sudo fc-cache 명령으로 사용가능하다.

네이버에서 정9체로 검색하면 어떤분의 블로그에 엔터플립9와 정9가 있다. 난 이폰트들도 설치했다.
이분의 블로그에 있는 폰트파일은 rar로 압축되어있어서 풀리지 않을것이다
sudo apt-get install rar 설치하면 풀린다.

3. 파이어폭스 플래시 플러그인 설치.

파폭을 키고 네이버에 접속하면 플러그인 설치창이 나온다 (윈도에서 엑티브X설치처럼)
여기서 자동으로 설치가 가능하면 패스
설치 실패라고 나오면 수동설치 선택한다 그러면 어도비홈피로 간다.
그곳에서 플러그인을 다운로드한다.
터미널에서 다운로드받은곳으로 이동
./받은파일명 명령으로 실행해서 설치한다
간단히 엔터 두번두르고 y 한면 n 한번이면 설치된다. (파폭을 다시키면 사용가능)
질문은 간단한 영어이니 읽어보면 바로 이해된다.

4. 멀티미디어 환경설치 (mplayer,코덱,totem-xine,파폭mplaeyr플러그인)

아래명령 실행으로 위 환경들을 설치한다.
본페이지 상단의 소스리스트를 추가하지 않았다면 설치가 안될것이다.

sudo apt-get install mplayer
sudo apt-get install mplayer-fonts
sudo apt-get install w32codecs

sudo apt-get install totem-xine
sudo apt-get install mozilla-mplayer

위명령으로 동영상과 웹상에서동영상을 볼수있다.
(웹에서는 모든동영상이 나오질 않는다. youtube와 윈도우미디어플레이어 기반의 웹동영상은
잘나오지만 기타 플래시기반이라고하나..뭐 요런것들은 나오지 않는경우가 많다)

mplayer 자막설정

실행후 환경설정탭(영어로 프레퍼런스인가..) 를 클릭한다
subtitle & osd 탭에서 encoding 을 korean charset(cp949) 로 바꾼다
font 탭에서 폰트를 /usr/share/fonts/truetype/baekmuk/gulim.ttf 으로 바꾼다.
(이부분은 맘에드는 폰트로 바꾼다. /usr/share/fonts/ 에서 고르면된다)
encoding 부분은 unocode 로 한다. 크기조절은 본인스타일에 맞게 설정한다.)

mp3 듣기

sudo apt-get install beep-media-player 명령으로 bmp 설치한다.

http://www.ubuntu.or.kr/wiki.php/BMP%28Beep-Media-Player%29
이페이지를 참고하여 설정한다.

mp3 플레이어는 amarok,xmms등 여러 프로그램이 있으니 우분투 사용자 모임에서 검색후
본인에게 맞는 것으로 사용한다.


5. 기타 잡다한것 설치.

프로그램-추가/제거에서 원하는 프로그램을 검색하고 설치할수 있다.

#build-essential (gcc,make...솔직히 잘모른다. gcc나 make명령을 사용하려면 설치한다)

sudo apt-get install build-essential

#ftp 글라이언트 GFTP 프로그램
 sudo apt-get install gftp 로설치

#xChat  프로그램

sudo apt-get install xchat

#wine 윈도우기반 프로그램을 돌려준다 모든프로그램이 돌아가는것은 아니다.

apt-get install wine

winecfg 명령으로 환경설정

#grub 부트로더 편집

#요거 잘못건드리면 부팅안되니 불안하거나 자신없거나 걱정된다면 아예 건들지 말기 바란다.
#혹시 몰라 menu.list 파일 첨부한다.
#절대로 이파일을 똑같이 사용하면 안된다.
#파티션설정이 다를수 있기때문에. 어떤 식인가만 보고 본인에 맞게 편집하면 된다.


모든설정을 마친후 윈도우와 우분투가 정상부팅된다면 grub를 좀 간단하게 보이도록 편집해도 된다

/boot/grub/menu.list 파일을 편집하여
우분투 최신커널과 윈도우만 남기고 삭제해도 무방하다.
혹시 불안하다면 이전 버전의 커널도 하나 남겨둔다.

#넘버록키기와 터미널 사용시 삑~ 하는 pc스피커소리끄기

넘버록 키기

자동으로 안켜진다면
sudo apt-get install numlockx 설치로도
켜지고

시스템-기본설정-키보드-키배치옵션
capslookkey behavior 탭에서 기본설정 아래 항목에 체크해두면 켜지는것 같다.

삑소리끄기

시스템-기본설정-소리-시스템벨소리탭에서 벨소리 체크를 풀면면다.


이것으로 우분투 6.06대퍼 기본설정을 마친다.
도움이 되었길 바라며..

http://www.gnome-look.org/ 에서 테마파일을 받을수 있다

설정후 스샷을 포함한다.

vi 편집기 사용법

Posted by 시경이 Study/Linux : 2007/07/03 18:06
 
출처 블로그 > Find the Niche!!! Crossing The Chasm!!!
원본 http://blog.naver.com/nowtrand/10013342374

vi 편집기

 

1. 텍스트 입력 모드

명령모드에서 텍스트 입력 모드로 전환하기 위한 키

수행

i

텍스트가 커서 앞에서 삽입된다.

I

텍스트가 현재 줄의 시작에 삽입된다.

a

텍스트가 커서 뒤에서 삽입된다.

A

텍스트가 현재 줄의 끝에 삽입된다.

o

텍스트가 현재 줄 다음부터 삽입된다.

O

텍스트가 현재 줄 앞에서 삽입된다.

R

텍스트가 대치된다.(겹쳐 써진다.)

 

다음 줄로 이동하기 위해서 엔터 키를 눌러야 한다.

입력된 마지막 문자를 지우기 위해서 백스페이스 키를 이용할 수 있다.

텍스트 입력 모드에 있을 때는 커서, 화살표, 키를 사용하여 화면 내에서 커서를 이동하면 안된다.

텍스트 입력 모드에서는 커서 이동 키들이 정규 아스키 문자로 해석되므로, 제어 코드들은 일반적인 텍스트로 입력된다.

텍스트 입력 모드에서 명령 모드로의 전환은 Esc 키를 누름으로써 가능하다.

 

2. 명령 모드

텍스트를 편집하기 위해서는, 명령 모드에 있어야 한다. 텍스트 입력 모드에서 명령 모드로 전환하기 위해서는 Esc키를 눌러야 한다. 명령 모드에서 실수로 Esc키를 누르면 아무 일도 발생하지 않는다.

 

vi의 편집 특성) 특수한 문자들을 연속적으로 누름. > 한 단어를 지우기 위해 그 단어의 첫 문자 위치로 커서를 이동한 다음 d 키를 누르고, 곧이어 w 키를 누르면 된다.

일부 편집 특성은 인수를 요구, 콜론(:) 키를 누른 다음 곧이어 명령과 엔터 키를 누름으로써 그 특성에 접근할 수 있다.

콜론 키가 눌러 졌을 때, 명령 입력 줄이 화면 맨 아래 부분에 나타난다.

 

) 엔터키는 로 표시되고, <, > 문자는 타이핑하여 입력하는 것이 아님.

 - 첫 번째 줄에서부터 세 번째 줄까지를 모두 지울때의 명령열 입력

:1,3d

 

블록 지우기 명령과 같은 일부의 편집 특성은 줄 단위로 처리. vi는 줄단위로 범위 지정하는 형식을 가짐

l       한 줄을 선택하려면 그 줄 번호를 지정한다.

l       줄 단위로 블록을 선택하려면 첫 줄 번호와 마지막 줄 번호를 콤마로 분리하여 지정한다.

 

vi에서는 파일의 마지막 줄 번호를 대신하는 표기로 $를 사용하고, 그리고 현재 커서가 있는 줄 번호를 대신하는 표기로 .을 사용한다. 또한 vi에서는 줄 번호의 상태를 나타낼 때 산술식을 이용할 수도 있다.

 

) :.,.+2d

현재 커서가 있는 줄과 그 다음의 두 줄을 지운다.

 

범위를 지정하는 예

범위

선택

1,$

파일 내의 모든 줄

1,.

파일의 첫 줄에서부터 현재 줄까지의 모든 줄

.,$

현재 줄에서부터 파일의 마지막 줄까지의 모든 줄

.-2

현재 줄부터 앞쪽으로 두 번째에 해당하는 한줄

 

3. 일반적인 편집 특성

* 커서 이동

* 텍스트 지우기

* 텍스트 치환

* 텍스트 붙이기

* 텍스트 탐색

* 텍스트 탐색/치환

* 파일의 저장/불러오기

* 그 밖의 것(vi 나오기 등 포함)

 

1) 커서 이동

기본적인 커서 이동 명령

이동

키 순서

한 줄 위로

또는 k

한 줄 아래로

또는 j

한 문자 오른쪽으로

또는 l

한 문자 왼쪽으로

또는 h

줄의 시작으로

^

줄의 마지막으로

$

한 단어 앞으로

b

한 단어 뒤로

w

반 화면 아래로

Control-D

한 화면 아래로

Control-F

반 화면 위로

Control-U

한 화면 위로

Control-B

줄 번호 nn 위치로

:nn

 

2) 텍스트 지우기

일반적인 텍스트 지우는 명령

지울 대상

키 순서

문자

문자 위에 커서를 위치시키고 x를 누른다.

단어

단어 시작 부분에 커서를 위치시키고 두 문자 dw를 누른다.

줄 위의 아무 곳에나 커서를 위치시키고 두 문자 dd를 누른다. (dd앞에 수를 입력하면, 현재 줄에서 시작하여 명시된 수만큼 삭제된다.)

현재 줄의 끝까지

D를 누른다.

블록 단위의 줄

:d

 

3) 텍스트 치환

명령

치환대상

키 입력 순서

문자

문자 위에 커서를 위치시키고 r을 누른 다음 치환할 문자를 타이핑 한다.

단어

단어의 첫 위치에 커서를 두고 cw를 누른 다음, 치환할 텍스트를 타이핑하고 Esc 키를 누른다.

줄의 아무 위치에나 커서를 위치시키고 cc를 누른 다음, 치환할 텍스트를 타이핑하고 Esc 키를 누른다.

 

: 범위

 

4) 텍스트 붙이기

vi는 파일 내의 영역 사이에 텍스트를 복사하거나, 붙이기 위한 임시 저장 장소인 붙이기 버퍼를 같는다.

명령

행동

키 순서

줄을 붙이기 버퍼로 복사(yank)

:y

현재 줄 다음에 붙이기 버퍼의 내용을 삽입(put)

P 또는 :pu (붙이기 버퍼의 내용은 변하지 않는다)

줄 번호 nn번 다음에 붙이기 버퍼의 내용을 삽입(put)

:nnpu (붙이기 버퍼의 내용은 변하지 않는다)

 

) 처음 두 줄을 붙이기 버퍼로 복사하고, 세번째 줄 다음에 그내용을 붙이려면 두번의 명령 입력

:1,2y

:3pu

 

5) 탐색

vi는 현재의 줄을 기준으로 파일의 뒤쪽 그리고 앞쪽으로 특별한 문자열을 찾을 수 있는 기능을 가지고 있다. 여기서 뒤쪽은 파일의 시작 부분을 기준으로 한 방향.

행동

키 순서

현재 위치에서 파일의 뒤쪽으로 문자열 sss를 탐색

/sss/

현재 위치에서 파일의 앞쪽으로 문자열 sss를 탐색

?sss?

마지막 탐색 명령을 반복

n

반대 방향으로 마지막 탐색 반복

N

 

6) 탐색/치환

행동

키 순서

각 줄 중 sss가 처음 발견된 줄만 ttt로 치환시킨다.

:s/ sss/ ttt/

각 줄 중 sss가 발견되면 모두 ttt로 치환시킨다.

:s/ sss/ ttt/g

 

7) 파일의 저장/불러오기

명령

행동

키 순서

<이름>으로 파일을 저장

:w<이름>

현재의 이름으로 파일을 저장

:w

어떤 줄들만을 다른 파일에 저장

:w<이름>

현재 위치에서 다른 파일의 내용 읽기

:r<이름>

현재 파일 대신에 <이름>의 파일을 편집

:e<이름>

초기 명령 줄 상에 주어진 파일 중 다음 순서의 파일을 편집

:n

 

처음 vi를 부를 때, 명령 줄에 여러 파일이 있는 경우, vi는 첫 번째 파일부터 편집 상태로 만든다. 그 다음 파일을 편집하기 위해서는 :n을 사용한다.

 

8) 그 밖의 명령

vi끝내기와 같은 가장 일반적인 명령 목록

행동

키 순서

화면을 다시 그린다.

Control-L

서브셸에서 명령을 실행한 다음 vi로 되돌아한다.

:!<명령>

서브셸에서 명령을 실행하고 출력을 편집 버퍼의 현재 위치로 읽는다.

:r!<명령>

만일 작업 내용을 저장하였다면 vi를 빠져나간다.

:q

작업 내용을 저장하지 않고 vi를 빠져나간다.

:q!

 

삽입 명령

a

커서 뒤에 입력

A

라인 끝에 입력

i

커서 앞에 입력

I

라인시작 부분에 입력

o

커서 있는 라인 밑에 입력

O

커서가 있는 라인 위에 입력

커서 이동 명령

h

왼쪽으로 커서 한 칸 이동

H

화면의 처음으로 이동

L

오른쪽으로 한 칸 이동

L

화면 끝으로 이동

e

다음 단어의 마지막으로 이동

E

커서를 공백으로 구분된 다음 단어 끝으로 이동

b

한 단어 뒤로 이동

B

커서를 공백으로 구분된 이전 단어로 이동

w

커서를 한 단어 뒤로 이동

W

커서를 공백으로 구분된 다음 단어로 이동

k

커서를 한 라인 위로 이동

j

커서를 한 라인 아래로 이동

O

커서를 라인의 시작으로 이동

$

커서를 라인의 끝으로 이동

Enter

커서를 다음 라인 시작으로 이동

-

커서를 전 라인의 시작으로 이동

Ctrl + F

다음 화면으로 이동

Ctrl + D

화면의 반만 앞으로 이동

Ctrl + B

전 화면으로 이동

Ctrl + U

화면의 반만 뒤로 이동

G

커서를 텍스트 마지막 라인으로 이동

숫자G

커서를 숫자 라인만큼 이동

M

커서를 화면 중간 라인으로 이동

커서를 전 위치로 이동

(

문장의 시작으로 이동

{

문단의 시작으로 이동

)

문장 끝으로 이동하여 다음 단어의 시작으로 커서 이동

}

문단 끝으로 이동

삭제 명령

x

커서가 있는 문자 삭제

X

커서가 있는 문자 앞에 있는 문자 삭제

dw

커서가 있는 단어 삭제

db

커서가 앞에 있는 단어 삭제

dW

공백으로 구분된 뒷 단어 삭제

dB

공백으로 구분된 앞 단어 삭제

dd

커서가 있는 라인 삭제

D

커서가 있는 라인의 나머지 삭제

d)

문장의 나머지 삭제

d}

문단의 나머지 삭제

dG

파일의 나머지 삭제

dH

화면의 시작까지 삭제

dL

화면의 나머지 삭제

J

커서와 다음 단어의 공백을 모두 삭제

바꾸기 명령

r

커서에 있는 문자 대치

R

입력 모드로 한 문자씩 덮어씀

s

커서가 있는 문자 삭제 후 입력 모드로 전환

S

커서가 있는 줄을 삭제 후 입력 모드로 전환

cb

커서가 있는 앞 문자 삭제 후 입력 모드

cW

공백으로 구분된 뒷 단어를 삭제 후에 입력 모드

cB

공백으로 구분된 앞 단어 삭제 후 입력 모드

cc

커서가 있는 라인을 삭제하고 입력 모드

C

커서가 있는 라인의 나머지를 삭제하고 입력 모드로 전환

cO

커서에서부터 라인의 시작까지 텍스트 바꾸기

c

특정 텍스트 바꾸기

c)

문장의 나머지 바꾸기

c}

문단의 나머지 바꾸기

cG

파일의 나머지 바꾸기

cm

표시까지 모든 것 바꾸기

cL

화면의 나머지 바꾸기

ch

화면의 시작까지 바꾸기

이동

p

삭제나 복사된 텍스트를 커서가 있는 문자나 라인 뒤에 삽입

P

삭제나 복사된 텍스트를 커서가 잇는 문자나 라인 앞에 삽입

dw p

커서가 있는 단어를 삭제한 후 이를변경한 커서가 있는 것 뒤에 삽입

dw P

커서가 잇는 단어를 삭제 후 이를 변경한 커서 있는 곳 앞으로 삽입

d p

지정한 다음 텍스트로 삭제한 후 커서가 가리키는 곳으로 이동

d) P

문장의 나머지로 이동

d} p

문단의 나머지로 이동

dG P

파일의 나머지로 이동

dH p

회면 시작 부분으로 이동

dL P

화면의 나머지를 이동

복사

yw

커서가 있는 단어를 복사

yb

커서가 있는 앞 단어를 복사

yW

공백으로 구분된 뒷 단어 복사

yB

공백으로 구분된 앞 단어를 복사

y

특정한 다음 텍스트 복사

yy

커서가 있는 라인을 복사, 커서가 가리키는 곳으로 라인을 이동

y)

문자의 나머지 복사

y}

문단의 나머지 복사

yG

파일의 나머지 복사

yH

화면의 시작까지 복사

yL

화면의 나머지 복사

검색

/patter

n

텍스트에서 앞으로 패턴 검색

>patter

텍스트에서 뒤로 패턴 검색

n

앞 또는 뒤로 이전 검색 반복

N

반대 방향으로 이전 검색 반복

/

전 검색을 앞으로 반복

?

전 검색을 뒤로 반복

 

vi 에디터 종료 마치기 명령

:q

그대로 종료하기

:q!

변경된 내용을 저장하지 않고 강제로 종료하기

:wq

변경된 내용을 저장하고 종료하기

:x

:wq와 동일한 명령

ZZ

:wq와 동일한 명령

삽입 명령

a

커서 뒤에 입력

A

라인 끝에 입력

I

커서 앞에 입력

I

라인시작 부분에 입력

o

커서 있는 라인 밑에 입력

O

커서가 있는 라인 위에 입력

방향키를 이용한 커서 이동 명령

<-, Del

왼쪽으로 커서 한 칸 이동

PageUp

화면 위로 이동

->

SpaceBar

오른쪽으로 한 칸 이동

PageDown

화면 아래로 이동

윗 줄로 커서 이동

Enter

다음 줄 첫 칸으로 이동

아래 줄로 커서 이동

Esc

다음 줄 첫 칸으로 이동

Home

줄 처음 칸으로 이동

다른 키를 이용한 커서 이동 명

H

왼쪽으로 커서 한 칸 이동

k

윗 쪽으로 커서 이동

l

오른쪽으로 한 칸 이동

j

아래쪽으로 커서 이동

e

다음 단어의 마지막 칸으로 이동

E

공백으로 구분된 뒷 단어의 마지막 칸으로 이동

b

앞 단어의 앞 칸으로 이동

B

공백으로 구분된 앞 단어의 앞 칸으로 이동

W

다음 단어의 앞 칸으로 이동

W

공백으로 구분된 뒷 단어의 앞 칸으로 이동

그 외의 키를 이용한 커서 이동 명령

Ctrl + F

다음 화면으로 이동

Ctrl + D

반 화면 위로 이동

Ctrl + B

(앞) 화면으로 이동

Ctrl + L

반 화면 아래로 이동

O

줄이 시작되는 첫 칸으로 이동

-

이전 줄의 시작 부분으로 이동

$

줄이 끝나는 마지막 칸으로 이동

+

다음 줄의 시작 부분으로 이동

(

문장의 시작으로 이동

{

문단의 시작으로 이동

)

문장의 끝으로 이동하여 다음 단어의 시작 첫 칸으로 커서 이동

}

문단의 끝으로 이동

G

문서의 마지막 줄로 이동

이전의 커서 위로 이동

nG

n번째 줄로 이동

M

화면 중간 줄에 커서 이동

삭제 명령

x

커서가 있는 문자 삭제

X

커서가 있는 문자 앞에 있는 문자 삭제

dw

커서가 있는 단어 삭제

db

커서 앞에 있는 단어 삭제

dW

공백으로 구분된 뒷 단어 삭제

dB

공백을 구분된 앞 단어 삭제

dd

커서가 있는 라인 삭제

D

커서가 있는 라인의 나머지 삭제

d)

문장의 나머지 삭제

d}

문단의 나머지 삭제

dG

파일의 나머지 삭제

dH

화면의 시작까지 삭제

dL

화면의 나머지 삭제

J

커서와 다음 단어 사이의 모든 공백 삭제

바꾸기 명령

R

커서에 잇는 문자 대치

R

입력 모드로 한 문자식 덮어 씀

s

커서가 있는 문자 삭제 후 입력 모드로 전환

D

커서가 있는 줄을 삭제한 후 입력 모드로 전환

cb

커서가 있는 앞 문자 삭제 후 입력 모드

cW

공백으로 구분된 뒷 단어를 삭제한 후 입력 모드

cB

공백으로 구분된 앞 단어 삭제 후 입력 모드

cc

커서가 있는 라인을 삭제하고 입력 모드

C

커서가 있는 라인의 나머지를 삭제하고 입력 모드로 전환

cO

커서에서부터 라인의 시작까지 텍스트 바꾸기

c

특정 텍스트 바꾸기

c)

문장의 나머지 바꾸기

c}

문단의 나머지 바꾸기

cG

파일의 나머지 바꾸기

cH

화면의 시작까지 바꾸기

cL

화면의 나머지 바꾸기

텍스트 이동

p

삭제나 복사된 텍스트를 커서가 있는 문자나 라인 뒤에 삽입

P

삭제나 복사된 텍스트를 커서가 있는 문자나 라인 앞에 삽입

dw p

커서가 있는 단어를 삭제한 후 이를 원하는 곳 커서 뒤로 삽입

dw P

커서가 있는 단어를 삭제한 후 이를 변경한 커서가 있는 곳으로 삽입

d p

지정한 다음 텍스트로 삭제한 후 커서가 가리키는 곳으로 이동

d) P

문장의 나머지로 이동

d} p

문단의 나머지로 이동

dG P

파일의 나머지로 이동

dH P

화면 시작 부분으로 이동

dL P

화면의 나머지를 이동

복사

yw

커서가 있는 단어를 복사

yb

커서가 잇는 앞 단어를 복사

yW

공백으로 구분된 뒷 단어 복사

yB

공백으로 구분된 앞 단어를 복사

y

특정한 다음 텍스트 복사

yy

커서가 있는 라인을 복사, 커서가 가리키는 곳으로 라인을 이동

y)

문자의 나머지 복사

y}

문단의 나머지 복사

yG

파일의 나머지 복사

yH

화면 시작까지 복사

yL

화면의 나머지 복사

검색

/pattern

텍스트에서 앞으로 패턴 검색

>pattern

텍스트에서 뒤로 패턴 검색

n

앞 또는 뒤로 이전 검색 반복

N

반대 방향으로 이전 검색 반복

/

전 검색을 앞으로 반복

?

전 검색을 뒤로 반복

옵션

옵션약어

기능

디폴트

autoindent

ai

들여 쓰기 가능, 탭으로 들여 쓰기 범위 지정

off

autoprint

ap

줄이 바뀔 때 현재 줄을 화면상에서 출력

on

errobells

ed

명령 에러가 발생시 삑 소리나게 함

off

number

nu

줄 번호를 나타나게 함

off

report

report

편집시 메시지를 보낼 편집 변화 크기 지정

5

showmatch

sm

가로 닫기 괄호를 사용할 때 일치하는 가로 열기 괄호를 보여줌

off

wam

wam

저장하지 않고 vi 종료할 때 경고 메시지를 뿌려 줌

on

ignorecase

ic

검색 패턴에 사용되는 대소문자 구별하지 않음

on

tabstopp=n

ts=n

탭 공백을 n 수만큼 지정

8

wrapmargin=n

wm=n

태그 : vi편집기
 «이전 1  다음»