강좌 & 팁
gcc 컴파일러 설치
이제 컴파일러를 설치할 때가 되었습니다. 컴파일러를 설치한 후에 Cygwin에서 안 되었던 fork()함수 사용과 공유메모리 사용에 대해 알아 보겠습니다. 제가 예전에 Cygwin을 사용했을 때에는 fork()와 공유메모리가 안 되어서, coLinux에서 gcc 컴파일러를 설치하자 마자 이와 같은 내용을 확인해 봅니다만, 요즘 Cygwin에서는 되는지 모르겠네요.
일단 gcc 컴파일러를 설치하겠습니다. 설치는 역시 yum install 로 간단히 처리하겠습니다.
]# yum instll gcc ]# yum install gcc-c++ ]# gcc --version gcc (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8) Copyright (C) 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ]# g++ --version g++ (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8) Copyright (C) 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
다시 한번 yum의 위력을 실감합니다. ^^
fork() 함수 테스트
Cygwin에서 fork() 나 공유메모리 사용이 안 되는 이유는 단순한 리눅스 이뮬레이터이기 때문이라고 하더군요. 사실 Cygwin을 사용하다가 한계를 느끼는 이유는 도대체 어떤 리눅스인지 참 애매하다는 것입니다. 젠투? 데비안? 페도라? 사실 이렇게 분류될 수 없는 Cygwin만의 리눅스입니다. 그렇다 보니, 작업 중에 막히는 부분이 있으면 웹으로 검색하게 되는데, 올려진 답이 데비안이나 페도라, 젠투, 최근에는 우분투인데, 이런 해답이 Cygwin에서는 제대로 소용이 없더군요.
그러나 coLinux는 Cygwin처럼 이뮬레이터이지만 기존의 젠투, 데비안, 페도라, 우분투 식으로 애용하는 리눅스 사용방법을 그대로 사용할 수 있어서 이런 혼란을 피할 수 있고, 단순하 이뮬레이터가 아니라 fork()나 공유메모리를 사용할 수 있어서, 앞으로 더 확인해 봐야 겠습니다만, coLinux에서 대부분의 디버깅 작업이 가능합니다.
그럼 fork()함수부터 확인해 보겠습니다. 프로그램 예제는 아래와 같습니다.
#include <stdio.h> #include <unistd.h> int main() { int counter = 0; pid_t pid; printf( "작식 프로세스 생성"); pid = fork(); switch( pid) { case -1 : { printf( "자식 프로세스 생성 실패\n"); return -1; } case 0 : { printf( "저는 자식 프로세스로 디스카운트하겠습니다.\n"); while( 1 ) { printf( "자식: %d\n", counter--); sleep( 1); } } default : { printf( "저는 부모 프로세스로 카운트하겠습니다.\n"); printf( "자식 프로세스의 pid는 %d입니다.\n", pid); while( 1 ) { printf( "부모: %d\n", counter++); sleep( 1); } } } }
이상 없이 실행되었습니다.
]$ ./test 작식 프로세스 생성자는 자식 프로세스로 디스카운트하겠습니다. 자식: 0 작식 프로세스 생성저는 부모 프로세스로 카운트하겠습니다. 자식 프로세스의 pid는 2695입니다. 부모: 0 자식: -1 부모: 1 자식: -2 부모: 2 자식: -3 부모: 3 :
공유 메모리 사용 가능
공유 메모리인 만큼 두 개의 프로그램을 작성하여 테스트했습니다. 테스트 방법은 FALINUX 포럼에 올려진 "shmget() 공유 메모리 생성" 글에 소개된 예제를 이용했습니다.
공유 메모리를 생성하고 계속 카운터를 증가시키는 counter.c 입니다. 공유 메모리의 변수 값을 증가 시킬 뿐 화면에 출력하는 것은 없습니다.
#include <stdio.h> // printf() #include <unistd.h> // sleep() #include <sys/ipc.h> #include <sys/shm.h> #define KEY_NUM 9527 #define MEM_SIZE 1024 int main( void) { int shm_id; void *shm_addr; int count; if ( -1 == ( shm_id = shmget( (key_t)KEY_NUM, MEM_SIZE, IPC_CREAT|0666))) { printf( "공유 메모리 생성 실패\n"); return -1; } if ( ( void *)-1 == ( shm_addr = shmat( shm_id, ( void *)0, 0))) { printf( "공유 메모리 첨부 실패\n"); return -1; } count = 0; while( 1 ) { sprintf( (char *)shm_addr, "%d", count++); // 공유 메모리에 카운터 출력 sleep( 1); } return 0; }
counter.c에서 계속 증가 시키는 공유 메모리의 값을 아래의 show_counter.c 로 출력합니다.
#include <stdio.h> // printf() #include <unistd.h> // sleep() #include <sys/ipc.h> #include <sys/shm.h> #define KEY_NUM 9527 #define MEM_SIZE 1024 int main( void) { int shm_id; void *shm_addr; if ( -1 == ( shm_id = shmget( (key_t)KEY_NUM, MEM_SIZE, IPC_CREAT|0666))) { printf( "공유 메모리 생성 실패\n"); return -1; } if ( ( void *)-1 == ( shm_addr = shmat( shm_id, ( void *)0, 0))) { printf( "공유 메모리 첨부 실패\n"); return -1; } while( 1 ) { printf( "%s\n", (char *)shm_addr); // 공유 메모리를 화면에 출력 sleep( 1); } return 0; }
역시 실행이 너무 예쁘게 잘 되었습니다. 아우~ 죽겠다!!
]$ ./counter & [1] 2697 ]$ ./show_counter 3 4 5 6 7 :
이상과 같이 겉 모습은 Cygwin과 비슷하지만 훨씬 띄어난 리눅스 이뮬레이터라는 것을 아실 수 있겠습니다. 정말 coLinux 사용을 꼭 권하고 싶습니다. ^^
이 글이 언제 쓰여진 것인지는 모르겠지만, 2008년도 중반에 cygwin 사용시 fork()와 공유메모리 사용이
가능합니다. 물론, 실제 내부에선 윈도우 자원을 사용하지만, linux api 사용 방법을 배우는데에는 크게 무리가 없는것 같습니다. 공유메모리도(IPC), cygserver 라는것을 깔면,(윈도우 서비스로 동작) 사용할수 있습니다.
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package gcc.i386 0:4.3.0-8 set to be updated
--> Processing Dependency: libgomp = 4.3.0-8 for package: gcc
--> Processing Dependency: glibc-devel >= 2.2.90-12 for package: gcc
--> Processing Dependency: libgomp.so.1 for package: gcc
--> Running transaction check
---> Package libgomp.i386 0:4.3.0-8 set to be updated
---> Package glibc-devel.i386 0:2.8-3 set to be updated
--> Processing Dependency: glibc-headers = 2.8-3 for package: glibc-devel
--> Processing Dependency: glibc = 2.8-3 for package: glibc-devel
--> Running transaction check
---> Package glibc.i386 0:2.8-3 set to be updated
--> Processing Dependency: glibc-common = 2.8-3 for package: glibc
---> Package glibc-headers.i386 0:2.8-3 set to be updated
--> Processing Dependency: kernel-headers for package: glibc-headers
--> Processing Dependency: kernel-headers >= 2.2.1 for package: glibc-headers
--> Running transaction check
---> Package glibc.i386 0:2.8-3 set to be updated
--> Processing Dependency: glibc-common = 2.8-3 for package: glibc
---> Package kernel-headers.i386 0:2.6.25-14.fc9 set to be updated
--> Finished Dependency Resolution
glibc-2.8-3.i386 from fedora has depsolving problems
--> Missing Dependency: glibc-common = 2.8-3 is needed by package glibc-2.8-3.i386 (fedora)
Error: Missing Dependency: glibc-common = 2.8-3 is needed by package glibc-2.8-3.i386 (fedora)
[root@localhost ~]#
이렇게 나오네요.. 강좌 따라서 쭈욱 잘 해 왔는데 여기서 막히나요.. ㅠ.ㅠ
glibc 가 문제인가... 뭐가 설치되 있나 보니까..
glibc.i686 2.8-8 installed
glibc-common.i386 2.8-8 installed
arm-gp2x-linux-glibc.noarch 2.3.6-5.fc9 fedora
glibc.i386 2.8-3 fedora
glibc-devel.i386 2.8-3 fedora
glibc-headers.i386 2.8-3 fedora
glibc-utils.i386 2.8-3 fedora
[root@localhost ~]#
이런 상태군요..
VirtualPC 에 리눅스 깔아 쓰다가 coLinux 써보니 디게 좋네요! ㅋ
하드 용량 4G 가 넘 작아서.. 20G 짜리 파일 하나 만들어서 /opt/prj 에 부팅시 마운트 되게 해 놓고
그 파티션에 작업공간 만드니 하드 공간 부족도 해결됐고..
정말 여긴 너무 유용한 사이트 같아요! 오아~~~~ ^^
cmd 창에서 D:\coLinux 디렉토리로 간 다음에 아래와 같이 파일을 생성합니다.
fsutil file createnew 20GB.img 21474836480
그럼 20GB.img 라는 20G 짜리 파일이 하나 생성되구요..
fedora.conf 였나요? 그.. 실행시킬때의 설정 파일에..
cobd2="D:/coLinux/20GB.img"
이런 줄 하나 넣어주면 /dev/cobd2 에 20G 짜리 파일이 들어서겠죠..
그럼 리눅스에서..
# mkfs -t ext3 /dev/cobd2
이렇게 20G 파일을 ext3 로 파일시스템을 설치해 주고 /dev/cobd3 를 ext3 로 마운트 하면 됩니다.
아예 시스템 전체를 20G 짜리로 옮기려면.. Fedora-9.img 파일을 카피해서 다른이름으로 넣고
cobd3 같은 곳에 마운트 해 준 다음에 그대로 cobd2 로 다 복사해 주고 난 뒤에..
20G 짜리를 root 로 마운트 해 주면 되겠죠..
그리고, yum에 감동받으셨다면 데비안을 한번 사용해보시기 바랍니다. apt-get은 yum보다 훨씬 좋고, 패키지 숫자도 많습니다. arm, ppc, mips 모두 포팅되어있기때문에 타겟 보드상에서도 같은 환경을 설치해서 쓸수 있다는게 가장 큰 매력입니다.