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 사용을 꼭 권하고 싶습니다. ^^