argv[0]

main 함수의 인자인 argv 배열의 첫번째 항목에는 command line에서 입력된 첫번째 인자, 즉 수행되는 프로그램의 이름이 들어갑니다.1 일반적으로 이 argv[0]는 잘 사용하지 않지요. 간혹 usage 출력에 사용되기는 합니다만...

그런데 예전에 Embedded Linux 교육을 받으면서 보니 이 argv[0] 항목을 사용한 BusyBox라는 재밌는 프로젝트가 있더군요.

Embedded 시스템들은 일반 시스템들보다 컴퓨팅 파워나 메모리 용량, 디스크 크기(플래시 메모리)에 있어서 제약이 많습니다. 그리고 하나의 a.out에는 그 프로그램이 실행해야 할 내용외에도 수 kb의 내용이 오버헤드로 포함됩니다. 이 오버헤드를 줄이게 되면 좀 더 작은 디스크나 플래시 메모리를 사용할 수 있게 되죠.

이 오버헤드를 줄이기 위해서 하나의 a.out에 다양한 프로그램의 기능을 집어넣은 것이 BusyBox입니다. 이렇게 만들어진 busybox라는 a.out은 다양한 이름으로 link가 됩니다. 제가 교육받으면서 만들었던 시스템의 /usr/bin 디렉토리에서 ls -l 한 결과를 예로 보면 다음과 같습니다.

 
lrwxrwxrwx    1 507      507            17 Mar 28  2007 [ -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 ar -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 awk -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 basename -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 bunzip2 -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 bzcat -> ../../bin/busybox
lrwxrwxrwx    1 507      507             3 Mar 28  2007 captoinfo -> tic
lrwxrwxrwx    1 507      507            17 Mar 28  2007 chvt -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 clear -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 cmp -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 cut -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 dc -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 deallocvt -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 dirname -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 du -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 env -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 expr -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 find -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 free -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 ftpget -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 ftpput -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 head -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 hexdump -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 id -> ../../bin/busybox
lrwxrwxrwx    1 507      507             3 Mar 28  2007 infotocap -> tic
lrwxrwxrwx    1 507      507            17 Mar 28  2007 install -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 killall -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 last -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 loadfont -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 logger -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 logname -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 md5sum -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 mesg -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 mkfifo -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 nc -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 nslookup -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 od -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 openvt -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 passwd -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 printf -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 readlink -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 renice -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 reset -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 seq -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 setkeycodes -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 sort -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 strings -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 tail -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 tee -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 telnet -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 test -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 tftp -> ../../bin/busybox
-rw-r--r--    1 root     root            0 Feb 28  2007 tic
lrwxrwxrwx    1 507      507            17 Mar 28  2007 time -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 top -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 tr -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 traceroute -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 tty -> ../../bin/busybox
-rwxr-xr-x    1 507      507        234861 Feb 28  2007 udevinfo
-rwxr-xr-x    1 507      507        358008 Feb 28  2007 udevtest
lrwxrwxrwx    1 507      507            17 Mar 28  2007 uniq -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 unzip -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 uptime -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 uudecode -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 vlock -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 wc -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 wget -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 which -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 who -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 whoami -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 xargs -> ../../bin/busybox
lrwxrwxrwx    1 507      507            17 Mar 28  2007 yes -> ../../bin/busybox
 

그리고 구현 방법을 보면... 실제 코드는 조금 다르지만 원리는 간단히 argv[0]를 사용하는 것이죠.

 
...
else if (strcmp("ls", argv[0]) == 0) do_ls();
else if (strcmp("telnet", argv[0]) == 0) do_telnet();
...
 

아이디어 좋죠? :-)


  1. int main(int argc, char* argv[]) [back]

4 Comments so far »

  1. codewiz said

    am October 11 2007 @ 13:33

    와 참신한 생각이네요.
    좋은 글 잘 읽고 갑니다.

  2. 까막 said

    am October 12 2007 @ 23:29

    busybox는 /init이나 /sbin/init도 해준답니다. :)
    Debian GNU/Linux의 initrd에 보면 들어있지요 ^_^;

  3. mkseo said

    am October 13 2007 @ 10:41

    오호… 신기하네요.

  4. Yang KwangWoong said

    am October 15 2007 @ 10:15

    요즘은 플래쉬 메모리값이 기가바이트당 만원 아래다…
    프로그래머들의 노고를 거대 메모리 제조사들이 삽질로 바꿔버렸다. 바보된거지…

Comment RSS · TrackBack URI

Leave a comment

Name: (Required)

eMail: (Required)

Website:

Comment: