UCD read successed

#########################

Signature = LGUPLUS 

Version = 01.01

SectorUsage = 3

ContentSize = 565135896

#########################

Signature = ZOOINNET

Version   = 01.01

Content Size = 565135896

Content Duration = 491021

Seek Offset = 565135896

Seek Length = 7856

IFR Offset = 565143752

IFR Length = 5073

PAT Offset = 565148825

PAT Length = 188

PMT Offset = 565149013

PMT Length = 188

hexdump -s 167927609 -n 8 -Cv M01127OB04PPV00M3208.mpg

  • while(fgets(s, MAX_BUFF, file) != NULL)
  • {
  • printf("Printing s: %s\n", s);

  • if(ferror(file))
  • {
  • break;
  • }
  • if(strncmp(s, stock_id, 5) == 0)
  • {
  • printf("Found the stock in %s!\n", argv[1]);
  • break;
  • }
  • }

  • Converting Strings to Numbers.
    ato...() 와 strto...()  부류의 함수들은 문자열을 값으로 변화하기 위해 사용된다. 헤더는 stdlib.h 이다.

    a 는 alpha(또는 ascii) 를 나타내고, str 은 string 을 나타낸다. strto...() 부류는 ato...() 부류에 비해 더 많은 제어와 오류검색을 제공한다.

    ato...() 부류

    atoi()
    오래전부터 정말 많이 쓰이던 함수로, 일명 아토이 함수라고도 불린다. 보통은 a to i 라고 읽는다. i 는 integer를 나타낸다. 문자열을 정수로 변환한다.

    int atoi(const char* );

    숫자가 아닌 문자들은 delimiter로 작용한다. 따라서 초반에 숫자 아닌 문자가 오면 변환이 안된다. 변환이 안될경우 0 을 리턴한다. 단, 문자열 초반의 whitespace 에 대해서는 무시한다.


    예.
    #include<stdio.h>
    #include<stdlib.h>

    int main(void) {
          char str[30];
          scanf("%s",str);
          printf("%d\n",atoi(str));
          return 0;
    }

    사용자 삽입 이미지


    atol()
    atoi() 와 같은데, 다만 변환이 long 형이다.

    long atol(const char* );


    atof()
    이것은 floating-point 특히, double형으로 변환한다.   period (.) 도 소숫점으로 인식한다.

    double atof(const char* );

    다음은 위의 예제 코드와 동일하되, %d 대신 %lf 를 , atoi 대신, atof 를 쓴것이다.


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


    strto...() 부류

    strtol()
    문자열을 long 형으로 변환하고 리턴한다.

    long strtol(const char* , char** , int );

    첫번째 인자는 변환할 대상 문자열이다.

    두번째 인자는 변환이 멈춘 지점의 "포인터의 주소"를 넘겨줄 대상이다. 즉, char** 형 변수가 와야한다. 이것을 NULL 로 설정하면, 멈춘 지점부터 시작하는 문자열을 아무곳에도 저장하지 않는다.

    세번째 인자는 기수법의 밑(base)이다. 2부터 36 까지의 값을 갖는다.
    이 값은 변환할 문자의 범위를 지정하는 것으로, 가령 2 라고 하면, 문자열을 2진법으로 받아들여서 변환한다. 따라서, 0 과 1 만 변환을 수행하고 나머지는 delimiter 가 된다. 또 밑이 10 을 넘는 경우에는... A (또는 a ) 는 10 , B (또는 b ) 는 11 , ... , Z (또는 z) 는 35 과 같은 식으로 변환한다. 이때, 밑에 따라서 받아들이는 값도 그 진법에 맞게 해석된다. 따라서 변환된 값을 10진법으로 출력할 경우, 입력한 스트림과 다른 값이 나오게 된다.

    특히, base를 0 으로 설정하면, 입력한 스트림의 첫부분에 의해 베이스를 8, 16, 10 으로 유연하게 적용할 수 있다. 첫부분이 0x ( 또는 0X ) 이면, base를 16 으로 해석한다. 첫부분이 0x 는 아니면서 0 이면, base를 8 로 해석한다. 나머지 경우는 base 10 으로 해석한다.

    오버플로우 발생시, LONG_VAL 이나 -LONG_VAL 을 리턴하고, ERANGE 가 errno 에 저장된다.

    예.
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>

    int main(void) {
        int base;  long converted;  unsigned i;  char str[30] , *stop;

        printf("Input a string starting with a positive integer : ");      scanf("%s",str);
        printf("Input the base ( 2 ~ 36 ): ");                                 scanf("%d",&base);

        converted = strtol(str,&stop,base);

        for(i=0;i<(strlen(str)-strlen(stop));i++)
              printf("%c",str[i]);

        printf(" (%d)\t->\t%li (10)\n",base,converted);
        return 0;
    }

    실행화면.



    참고로 오류처리 부분만 제외하면...           atol(str)      는    strtol ( str , NULL , 10 )  와 같고,
                                                                atoi(str)     는     (int) strtol ( str , NULL , 10 ) 와 같다.




    strtoul()
    이것은 strtol() 과 유사하지만, unsigned long 을 리턴한다. 오버플로가 발생되면, ULONG_VAL 이나 -ULONG_VAL 이 리턴된다.

    unsigned long strtol(const char* , char** , int );


    strtod()
    이것은  문자열을 double 로 변환한다. 첫번째 인자와 두번째 인자의 의미는 strtol() 과 같다.

    double strtod( const char* , char** );

    오버플로우가 발생되면, HUGE_VAL 이나 -HUGE_VAL 이 리턴되고, 언더플로가 발생되면 0 이 리턴된다. 두경우 모두 ERANGE가 errno 에 저장된다.


    #include <jni.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/mman.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
     
    JNIEXPORT jbyteArray JNICALL Java_TSE_CreateIndex
      (JNIEnv * env, jobject jobj, jstring name) {
        caddr_t m;
        jbyteArray jb;
        jboolean iscopy;
        struct stat finfo;
        const char *mfile = (*env)->GetStringUTFChars(
                    env, name, &iscopy);
        int fd = open(mfile, O_RDONLY);
     
        if (fd == -1) {
          printf("Could not open %s\n", mfile);
        }
        lstat(mfile, &finfo);
        m = mmap((caddr_t) 0, finfo.st_size,
                    PROT_READ, MAP_PRIVATE, fd, 0);
        if (m == (caddr_t)-1) {
          printf("Could not mmap %s\n", mfile);
          return(0);
        }
        jb=(*env)->NewByteArray(env, finfo.st_size);
        (*env)->SetByteArrayRegion(env, jb, 0, 
        finfo.st_size, (jbyte *)m);
        close(fd);
        (*env)->ReleaseStringUTFChars(env, name, mfile);
        return (jb);
    }


    compile:


     gcc -fPIC -c ./TSE_Test.c -I/root/tmi/jdk1.7.0_04/include -I/root/tmi/jdk1.7.0_04/include/linux
     gcc  -o libnativelib.so -shared -Wl,-soname,libnative.so -I/root/tmi/jdk1.7.0_04/include -I/root/tmi/jdk1.7.0_04/include/linux TSE_Test.o

    'Linux > java' 카테고리의 다른 글

    Chapter 5 Continued: JNI Example  (0) 2012.07.16

    http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp.html



    Tutorials & Code Camps

    Chapter 5 Continued: JNI Example


     
    Training Index

    [<<BACK] [CONTENTS] [NEXT>>]

    This section presents the ReadFile example program. This example shows how you can use the Java Native Interface (JNI) to invoke a native method that makes C function calls to map a file into memory.

    About the Example

    You can call code written in any programming language from a program written in the Java language by declaring a native Java method, loading the library that contains the native code, and then calling the native method. The ReadFile source code below does exactly this.

    However, successfully running the program requires a few additional steps beyond compiling the Java language source file. After you compile, but before you run the example, you have to generate a header file. The native code implements the function defintions contained in the generated header file and implements the business logic as well. The following sections walk through all the steps.

    import java.util.*;
    
    class ReadFile {
    //Native method declaration
      native byte[] loadFile(String name);
    //Load the library
      static {
        System.loadLibrary("nativelib");
      }
    
      public static void main(String args[]) {
        byte buf[];
    //Create class instance
        ReadFile mappedFile=new ReadFile();
    //Call native method to load ReadFile.java
        buf=mappedFile.loadFile("ReadFile.java");
    //Print contents of ReadFile.java
        for(int i=0;i<buf.length;i++) {
          System.out.print((char)buf[i]);
        }
      }
    }
    

    Native Method Declaration

    The native declaration provides the bridge to run the native function in the Java1 virtual machine. In this example, the loadFile function maps onto a C function called Java_ReadFile_loadFile. The function implementation accepts a String that represents a file name and returns the contents of that file in the byte array.

      native byte[] loadFile(String name);
    

    Load the Library

    The library containing the native code implementation is loaded by a call to System.loadLibrary(). Placing this call in a static initializer ensures this library is only loaded once per class. The library can be loaded outside of the static block if your application requires it. You might need to configure your environment so the loadLibrary method can find your native code library.

      static {
        System.loadLibrary("nativelib");
      }
    

    Compile the Program

    To compile the program, just run the javac compiler command as you normally would:

      javac ReadFile.java
    

    Next, you need to generate a header file with the native method declaration and implement the native method to call the C functions for loading and reading a file.

    Generate the Header File

    To generate a a header file, run the javah command on the ReadFile class. In this example, the generated header file is named ReadFile.h. It provides a method signature that you have to use when you implement the loadfile native function.

      javah -jni ReadFile
    

    Note: When running javah on your own classes, be sure to use the fully-qualified class name.

    Method Signature

    The ReadFile.h header file defines the interface to map the Java language method to the native C function. It uses a method signature to map the arguments and return value of the Java language mappedfile.loadFile method to the loadFile native method in the nativelib library. Here is the loadFile native method mapping (method signature):

      /*
       * Class:     ReadFile
       * Method:    loadFile
       * Signature: (Ljava/lang/String;)[B
       */
      JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
        (JNIEnv *, jobject, jstring);
    

    The method signature parameters function as follows:

    • JNIEnv *: A pointer to the JNI environment. This pointer is a handle to the current thread in the Java virtual machine, and contains mapping and other hosuekeeping information.

    • jobject: A reference to the method that called this native code. If the calling method is static, this parameter would be type jclass instead of jobject.

    • jstring: The parameter supplied to the native method. In this example, it is the name of the file to be read.

    Implement the Native Method

    In this native C source file, the loadFile definition is a copy and paste of the C declaration contained in ReadFile.h. The definition is followed by the native method implementation. JNI provides a mapping for both C and C++ by default.

    #include <jni.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/mman.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
      (JNIEnv * env, jobject jobj, jstring name) {
        caddr_t m;
        jbyteArray jb;
        jboolean iscopy;
        struct stat finfo;
        const char *mfile = (*env)->GetStringUTFChars(
                    env, name, &iscopy);
        int fd = open(mfile, O_RDONLY);
    
        if (fd == -1) {
          printf("Could not open %s\n", mfile);
        }
        lstat(mfile, &finfo);
        m = mmap((caddr_t) 0, finfo.st_size,
                    PROT_READ, MAP_PRIVATE, fd, 0);
        if (m == (caddr_t)-1) {
          printf("Could not mmap %s\n", mfile);
          return(0);
        }
        jb=(*env)->NewByteArray(env, finfo.st_size);
        (*env)->SetByteArrayRegion(env, jb, 0, 
    	finfo.st_size, (jbyte *)m);
        close(fd);
        (*env)->ReleaseStringUTFChars(env, name, mfile);
        return (jb);
    }
    

    You can approach calling an existing C function instead of implementing one, in one of two ways:

    1. Map the name generated by JNI to the existing C function name. The Language Issues section shows how to map between Xbase database functions and Java language code

    2. Use the shared stubs code available from the JNI page on the java.sun.com web site.

    Compile the Dynamic or Shared Object Library

    The library needs to be compiled as a dynamic or shared object library so it can be loaded at runtime. Static or archive libraries are compiled into an executable and cannot be loaded at runtime. The shared object or dynamic library for the loadFile example is compiled as follows:

    Gnu C/Linux:
    
    gcc  -o libnativelib.so -shared -Wl,-soname,libnative.so  
         -I/export/home/jdk1.2/include 
         -I/export/home/jdk1.2/include/linux nativelib.c  
         -static -lc
    
    Gnu C++/Linux with Xbase
    
    g++ -o libdbmaplib.so -shared -Wl,-soname,libdbmap.so  
        -I/export/home/jdk1.2/include 
        -I/export/home/jdk1.2/include/linux 
        dbmaplib.cc -static -lc -lxbase
    
    
    Win32/WinNT/Win2000
    
    cl -Ic:/jdk1.2/include 
       -Ic:/jdk1.2/include/win32 
       -LD nativelib.c -Felibnative.dll
    

    Run the Example

    To run the example, the Java virtual machine needs to be able to find the native library. To do this, set the library path to the current directory as follows:

    Unix or Linux:
      LD_LIBRARY_PATH=`pwd`
      export LD_LIBRARY_PATH
    
    
    Windows NT/2000/95:
      set PATH=%path%;.
    

    With the library path properly specified for your platform, invoke the program as you normally would with the interpreter command:

      java ReadFile
    

    _______
    1 As used on this web site, the terms "Java virtual machine" or "JVM" mean a virtual machine for the Java platform. 


    'Linux > java' 카테고리의 다른 글

    JNIEXPORT from c to java  (0) 2012.07.16

    1. MinGW 설치

     

       Download -- http://www.mingw.org/

       (Downloads 섹션내의  downloads 부분을 보면 "sourceforge file Release" 부분을 클릭하면 됩니다)

     

      다운로드가 완료되면 136KB 정도의 작은 실행화일이 있습니다.(인스톨러 화일로 설치시 다운로드되면서 설치됩니다.)

      더블클릭하면 설치가 진행됩니다.

     

      MinGW 설치과정

    1.NEXT 를 눌러 진행합니다.

     

    2.다운로드와 설치를 같이 진행함으로 표시합니다. NEXT

     

    3.MinGW 버전을 고르는 곳입니다 Current 를 선택하고 NEXT

     

    4. 설치할 컴파일러를 설정하는 곳입니다.

      - 기본적으로 위의 체크를 하시면 됩니다. 그리고 화면에는 잘려있지만,

         (중요!!) MinGW Make는 설치 하지 않습니다.(JAVA 는 필요하시면 설치를..)

     

     

    5. MinGW 설치할 폴더를 선택 해주면 됩니다.

       그리고 이 폴더를 잘 기억해 두세요.^^

     

    이제 다운로드를 받으면서 설치를 합니다.

     

    2. MinGW Debugger 설치

     - 1번 설치 과정에서는 디버거 설치가 되어 있지 않습니다.

        다운로드 url -- http://sourceforge.net/project/showfiles.php?group_id=2435

        위 홈페이지에 접속하면 MingGW 관련 화일들을 다운로드 할 수 있습니다.

        위 홈페이지에서 아래 두가지 화일을 다운 받아야 합니다.

       

        1. 홈페이지의 File Release 부분에서 GNU Source-Level Debugger 탭에

           Latest Release Candidate:GDB 6.8-3 부분의 "gdb-6.8-mingw-3.tar.bz2" 파일을 다운로드 합니다.

     

        2. 좀더 아래쪽에 보면 MSYS 관련 부분이 있습니다. MSYS Base System 부분 아래쪽에

           Current Release:msys-1.0.10 탭이 있습니다. (이 부분이 "+"로 접혀 있으면 "+" 를 클릭하세요)

           MSYS-1.0.10.exe 를 다운 받으세요

        3. 기본적인 MinGW 환경을 위한 설치 화일은 모두 받은것입니다...

     

     위에서 받은 gdb-6.8-mingw-3.tar.bz2 파일을 (알집으로 풀면됩니다) 압축 해제 합니다.

     그럼 또하나의 압축 화일이 나오는데 다시 압축해제 하세요..

     보시면 몇가지 폴더가 나오는데 MinGW 설치 된 폴더 와 비슷한 구조입니다. 

     압축해제된 파일을 MingGW 가 설치된 해당 폴더에 복사해 넣어 주세요(덮어 쓰기 하세요 ^^)

     이제 디버거 까지 모양새를 갖췄습니다.

     

     

    3. MSYS 설치 (Minimal System)

     - 디버거 설치시 받았던 MSYS-1.0.10.exe 화일을 더블 클릭합니다.

    1.설치할 폴더를 정해줍니다.

     

    2. 이 화면은 Windows 시작 버튼 의 응용프로그램 폴더에 저장 하려고 하는겁니다.

     MinGW 와 같이 두는게 좋겠죠?

     

    3. 설치끝부분에 CMD 창이 실행 되면서 위와 같은 그림이 나옵니다.

    질문을 하는데 첫번째 질문이 post install 을 하겠느냐는 것이죠? 당연히 y 를 눌러 줍니다.

    두번째 질문은 MinGW 가 설치 되었느냐는 것인데 이것도 y 를 눌러 줍니다.

    마지막 질문은 MinGW가 설치된 폴더를 물어 봅니다. 화면에 보는데로 MingGW 가 설치된 폴더를 직접 작성해줍니다.

    전 c:/MinGW 이므로 화면 처럼 입력 했습니다(주의!!) 폴더 구분 표시자가 "\" 가 아닌 "/" 입니다.

     

    이것으로 MSYS까지 설정을 마쳤습니다.

     

    4. MinGW 와 MSYS 를  환경변수 PATH 에 경로 저장하기

    - 이 과정은 MinGW 와 MSYS 각각의 실행화일 들이 저장 되어 있는 각각의 bin 폴더를 억세스 할 수 있도록

      윈도우즈 PATH 환경변수에 경로를 기억 시키는 작업입니다.

     

     1. 바탕화면의 내 컴퓨터를 마우스 우측 버튼을 클릭해서 속성을 선택합니다.

     2. 속성창이 나오면 고급 탭을 누릅니다.

    3.환경변수를 클릭해서 들어갑니다.

     

     

    4. 환경변수 창입니다 . 시스템변수를 잘 보면 변수 부분에 PATH 를 찾아서 선택한다음 편집을 누릅니다.

     

     

    값 부분에 위 그림과 같이 MinGW\bin 폴더와 msys\bin 폴더를 추가로 입력해 주었습니다.

    패스 입력시 각각의 폴더 는 ";"로 구분합니다.

    즉 저같은 경우는 "C:\MinGW\bin;C:\msys\1.0\bin;" 이렇게 입력했습니다.

    아 만약 패스 입력하기전 PATH 의 값부분의 끝값에 ";" 이 없을수도 있습니다. 만약 없다면  

    ";C:\MinGW\bin;C:\msys\1.0\bin;" 이렇게 입력해 주셔야 합니다.  

    입력이 끝났으면 확인을 세번 눌러서 창을 닫아 주세요 ^^ 여기까지 MinGW 설치가 완전히 끝났습니다.

    공짜라 시키는 일도 많군요 ^^ 이제 설치가 제대로 되었는지 확인해 보죠 ^^

     

    5. MinGW 테스트

       

     - 윈도우즈 시작 -> 실행을 선택해서 다이얼로그가 나오면 cmd 라고 입력하고 엔터를 누르면

    위와 같은 도스창이 나옵니다. 

    여기서 

    >make 입력후 엔터

    >gcc --version 입력후 엔터

    결과가 위 화면과 같다면 설치가 완료 된것입니다.

    혹 내부 명령어가 아닙니다와 같은 메세지가 나온다면, 패스 지정이 잘못 된것이니 4번 과정을 차근히 보시면서

    다시 설정해 주세요 ^^

    이제 구슬이 서말이라도 꿰어야 보배 라고 이렇듯 준비된 베이스를 멋지게 이용할수 있는 무료 IDE 프로그램인

    Eclipse c/C++ 버전을 설치 하도록 하겠습니다.

      

    6. Eclipse 설치

     

      <중요!!> - Eclipse 는 java 기반 어플리케이션으로 jre, jdk 등을 필요로 합니다

       java 로 개발 하지 않으신다면, jre(java runtime) 만 설치 하시면 됩니다.

       jre 설치 주소 -- http://www.java.com/en/download/windows_automatic.jsp

       이동한 다음 파란 단추 누르면 설치 화면 나옵니다.

     

      jre 또는 jdk 가 이미 설치 되어 있거나 설치 완료 했다면, eclipse 를 다운로드 받으로 갑니다.

     

     eclipse 다운로드 링크 -- http://www.eclipse.org/downloads/

     사이트 이동하면 아래의 그림과 같을것입니다.

     

    약간 색깔이 틀린부분 Eclipse IDE for C/C++ Developers -Windows 버전 우측의 Windows 를 클릭해서 다운로드 하세요.

    원래 eclipse 에 CDT 를 따로이 설치 되야 하는걸 성격 좋으신분들이 다 마무리 해놓은 버전입니다.

    따로 설치 화일이 아닌 압축화일이므로 압축화일을 적당한곳에 풀어서 바로 사용하면 됩니다.

     

    C/C++ 에 최적화 되어 있습니다.

    따로 수정 해야 될건 없습니다.

    단지 Windows 관련 프로그래밍을 할때는 아래의 사항을 준수해야 합니다.

    프로젝트를 생성하고 난후 (ex)First_prj 란 프로젝트를 만들었을때

    project 메뉴의  Properties 를 클릭해서 아래의 사항을 추가해 주어야 합니다.

     

     

    1. Win32 어플리케이션 프로젝트를 하려고자 할때.

     

    Properties 의 트리메뉴에 C/C++Build 에 settings 를 선택하면 우측에 아래의 그림이 나옵니다.

     

     

    여기서 MinGW C++ Linker 를 선택해서 아래 그림과 같이 Miscellaneous 를 선택해서 우측 Linker flags 란에

    -mwindows 를 추가해줍니다.

    추가된 사진

    완료 했다면 Apply 후 OK 를 눌러 주세요 ..

    이상과 같이 설치 완료 했다면 윈도우즈 기반 프로그램 실행을 위한 개발툴 설정 까지 마쳤습니다.

    다른 분들의 글들에는 Mingw32-make.exe 화일을 make.exe 로 복사해서 사용하라고 해 놓았습니다.

    저도 그래서 처음 이 글에 그렇게 했었는데. MSYS 를 따로 설정 했기 때문에 , 그 부분은 필요가 없어졌습니다.

     

     

    3. TEST

    이제 정상적으로 작동하는지 테스트를 해봐야 겠군요.

    위에 링크 되어  있는 화일 test.cpp 화일을 적당한 곳에 카피해 둡니다.

     

    eclipse 를 실행시켜

    File -> New -> C++project 를 선택해서 프로젝트를 하나 만듭니다. (폴더는 알아서 ..)

    테스트 하려고 하는 test.cpp 화일의 코드는 그냥 윈도우 하나만 만들어 내는 프로그램입니다.

    그러니 win32 환경으로 컴파일이 되야 하므로 위 설정중 6-1 과정을 선택해줍니다.

    준비가 되었으면 cpp 화일을 하나 만들어야 겠습니다.

    Project Explorer 에서 방금 만들어진 프로젝트에 우클릭해서 New->Csource file 을 만듭니다.

    이때 확장자 .cpp 까지 넣어주세요 ex)main.cpp

    test.cpp 화일을 열어 내용을 복사후 위에서 방금 생성한 cpp 화일에 붙어 넣기 합니다.

    File->Save all 을 선택합니다.

     

     

    이제 컴파일만 남았군요.

    project 메뉴의 Build all 을 클릭해서 컴파일을 합니다. 에러가 없으면 통과

    그리고 Run 메뉴의 run 을 선택해서 프로그램을 실행합니다.

     

    아무내용도 없는 창이 하나 만들어 졌나요?

    축하합니다. 설치가 완료 되었습니다.

     

    ps: win32 어플리케이션을 만들려면 위 6-1 과정을 꼭 해줘야 합니다. 아니면 군데 군데

    "undefined refrence" 와 같은 에러를 토해냅니다 .. 저도 이과정에서 삽질을 좀 했었습니다 ^^.

    또 수정 했는데도 위와 같은 에러가 계속되면 File-> save all 또는 이클립스를 종료후 다시 시작하면 됩니다.

    제일 좋은 방법은 프로젝트 생성시 프로젝트 명을 눌러 next 를 클릭하면

    "select configuration" 창이 나오는데 여기서 "Advanced settings.." 를 클릭해서

    6-1과정으로 바꿔 주시면 됩니다. 아울러 Save all 도 해주셔야 합니다.


    나만의 환경 설정을 하도록 하자. [ 이클립스 창 -> 환경설정 ]

    1. 글꼴 및 색상

      - 글꼴은 은바탕+진함으로 설정하고, 색상은 이클립스에서 제공하는 기본 색상을 사용한다.

    사용자 삽입 이미지
    사용자 삽입 이미지


    2. Code Style

      - Code Style은 BSD/Allman [built-in]으로 설정한다.

    사용자 삽입 이미지

      - 주석에 대한 매크로 비슷한걸 설정할 수도 있다. 문서화를 위해서 doxygen 방식의 주석을 적용해보자

    사용자 삽입 이미지


    3. Editor

      - 이클립스가 자바 기반이다 보니 기본 Code Style이 자바 형식에 비슷하다.

        아무래도 나는 함수의 body({})가 다음 Line에 존재하는게 익숙하기 때문에 모든 기본 함수들의

        body를 수정했다.

    사용자 삽입 이미지


    4. 줄번호 삽입

      - 코딩라인을 표시하기 위한 줄번호 옵션을 체크한다.

    사용자 삽입 이미지


    5. 접기

       - 긴 함수 등의 구문을 접을 수 있다.

    사용자 삽입 이미지
    사용자 삽입 이미지
      - 위 그림과 같이 함수의 머리를 클릭하면 해당 함수 블럭의 색이 변한다(줄번호 부분).

        이때, 줄 번호 부분의 색이 변한 곳에서 마우스 오른쪽 버튼을 클릭하면, Folding이라는 메뉴가 뜬다.

        여기서, Folding을 사용하면 된다. 밑에 그림 처럼....

    사용자 삽입 이미지


    6. 단축키

      - 모두 빌드 : ctrl + b

      - 줄 정렬 : ctrl + shift + f

      - 해당 블럭 주석 : ctrl + /

      - 디버그 관련

          - break point : ctrl + shift + b

          - 디버깅 시작 : F11

          - 다음 코드로 넘어가기 : F5

          - 함수 블럭 내로 들어가기 : F6

          - 함수 블럭 내에서 빠져나오기 : F7

          - break point가 존재하는 곳으로 들어가기 : F8

          - 현재 라인까지 실행 : ctrl + r

      - 열려진창 모두 저장 : ctrl + shift + s 

      - 찾기 : ctrl + f

      - Editor로 이동하기(포커스가 다른 곳으로 이동했을때) : F12

      - 한줄 삭제 : ctrl + d

      - 줄 번호 찾기 : ctrl + l

      - 편집창 이동(탭 이동) : ctrl + (shift) + F6

      - 마지막 위치로 커서 이동하기 : ctrl + q

      - 컴파일 오류 발생시 다음 오류 지점으로 바로 가기 : ctrl + .

      - 컴파이 오류 발생시 이전 오류 지점으로 바로 가기 : ctrl + ,

      - 해당 함수나 변수의 정의 선언으로 가기 : F3

      - 해당 함수나 변수를 참조하거나 사용하는 부분을 검색 : ctrl + shift + g

        


    이클립스를 사용한지 얼마 안되어서 아직 모든 환경을 다 알지는 못한다.

    사용하면서 필요한 것들을 하나씩 더 추가하도록 하자.





    사용자 삽입 이미지

    시작하기 전에...

    Windows 환경에서 Visual C++에 익숙해져 있던 나에게 새로운 도전이 시작되었다.
    다름아닌 Linux 환경에서의 Programing이다.
    상당히 힘든 도전으로 여겨졌지만, Eclipse CDT라는 IDE를 발견하고서 자신감이 생긴다.
    Eclipse CDT! 아무래도 이녀석과 친해질듯 싶다.

    Eclipse CDT에서 간편하게 static library를 만들수가 있다.
    또한 만들어진 library를 가지고, 링크하여 사용하기도 굉장히 수월하다.


    1. static library 만들기

    less..

    사용자 삽입 이미지
     - 새로운 프로젝트를 생성한다.
       우리는 static library를 만들 것이기 때문에 static library를 선택하고 라이브러리의 이름을 써준다.


    사용자 삽입 이미지
    - 라이브러리에 사용할 클래스를 생성하도록 하자.


    사용자 삽입 이미지
    - 클래스 이름을 적어주고 완료 버튼을 눌러서 생성한다.


    사용자 삽입 이미지
    - 클래스가 완성되었으므로, 이제 코딩을 해야겠지?
     

    사용자 삽입 이미지
    - 당연히 CPP 해당 함수를 정의해야겠지?
      Hello World!!라는 글자가 찍히는 함수를 하나 만들었다.


    사용자 삽입 이미지
    - 저장후 빌드하고 컴파일 한다.


    사용자 삽입 이미지
    - 소스코드가 컴파일 되고, 오브젝트 파일과 라이브러리 파일이 만들어졌다.
       Unix계열에서는 라이브러리의 이름은 lib로 시작하고 확장자는 .a임을 잊지 말자!

    less..



    2. static library 사용하기

    less..

    사용자 삽입 이미지
     - 이제 방금 만든 static library를 테스트 하기 위해서 C++ 프로젝트를 만든다.


    사용자 삽입 이미지
    - 빈 프로젝트로 만들었으니 실행할 소스 파일을 만들어야겠지?


    사용자 삽입 이미지
    - main.cpp를 만들고 완료를 누른다.


    사용자 삽입 이미지
    - 이제 틀은 다 갖춰진것 같군.


    사용자 삽입 이미지
    - 아까전에 만들었던 static library를 사용하기 쉽도록 지금 만든 빈 프로젝트에 복사한다.
      좀 더 사용하기 쉽게 하려고 'inc'폴더와 'lib'폴더를 만들었다.


    사용자 삽입 이미지
    - 라이브러리 헤더 파일을 복사한다.


    사용자 삽입 이미지
    - 라이브러리 파일을 복사한다.


    사용자 삽입 이미지
    - 이제 프로젝트 -> 속성 -> C/C++ General -> Paths and Symbols에서 include 탭에 복사해 두었던 헤더파일을 포함하도록 한다. Add 버튼을 클릭한다.


    사용자 삽입 이미지
    - File system 버튼을 눌러서 해동 폴더를 찾는다.


    사용자 삽입 이미지
    - 포함할 폴더를 선택하고 확인을 누른다.


    사용자 삽입 이미지
    - 원하는 폴더를 포함하였다.


    사용자 삽입 이미지
    - 포함 파일의 폴더가 정확히 등록되었는지 확인하시고~


    사용자 삽입 이미지
    - 다음은 라이브러리 파일이 존재하는 폴더의 경로를 등록해보자.


    사용자 삽입 이미지
    - 아까처럼 File system을 누르고 폴더를 찾는다.


    사용자 삽입 이미지
    - 확인을 클릭~


    사용자 삽입 이미지
    - 등록한 라이브러리 경로가 맞는지 확인하시고~


    사용자 삽입 이미지
    - 자! 다음은 C/C++ Build -> Settings -> Tool Settings에서 Linker에 라이브러리를 등록하자.
      Linker 탭에 Libraries를 선택하면 그림과 같은 화면이 출력된다.
      여기서 오른쪽 중단에 Libraries (-l) 항목에 녹색의 추가 아이콘을 클릭한다.
      라이브러리를 링크하는 방법이 두가지가 있다.
      첫째, 옵션 -l의 사용이다. 이는 해당 라이브러리가 표준 장소(/usr/lib)에 존재할 때 해당
      라이브러리 이름을 등록하면 된다.
      둘째, 옵션 -L의 사용이다. 이는 해당 라이브러리가 표준 장소(/usr/lib)에 존재하지 않을 때
      사용하며 사용하고자 하는 라이브러리의 전체 경로를 넣어주어야 한다.


    사용자 삽입 이미지
    - 이제 라이브러리의 이름을 등록할 차례이다.
      아까도 언급했다시피 Unix 계열에서는 라이브러리의 이름은 lib로 시작하고 확장자는 .a다.
      여기서 lib와 .a를 뺀 나머지가 바로 라이브러리의 이름이다.


    사용자 삽입 이미지
    - 최종적으로 라이브러리까지 등록했다면 적용을 누르고 확인을 누르자!


    사용자 삽입 이미지
    - 이제 아까 만들어 두었던 main.cpp에다가 실제 main함수를 만들고, 우리가 만들었던 my 라이브러리를 테스트 해볼 시간이다.
    헤더 파일을 인클루드하고 클래스 객체를 선언한 후 Hello World 함수를 호출하고 컴파일 해보자.
    그림처럼 무난히 컴파일이 될 것이다.


    사용자 삽입 이미지
    - 최정적으로 실행하면... 콘솔창에 Hello World!!!가 출력되었다.
      여기까지가 static library를 사용하는 방법이었다.

    less..



    마치며...
     리눅스 프로그래밍을 시작하는 사람이라면 Eclipse CDT를 적극 추천해주고 싶다.
     원래는 자바용 IDE로 출발하였지만, c++도 문제 없다.

     좀 더 분발해서 적극 활용할 수 있도록 하자!


    memory lock Linux/C/C++ 2012. 7. 16. 10:31

    int mlock (const void *addr, size_t  len)

    int mlockall (int flags)

    int munlock(const void *addr, size_t len) 페이지 잠금 호출은 스택되지 않기 때문에 한번 같은 메모리 주소에 대해 여러 번 잠금 호출되었다고 하더라도 잠금을 해제할 때는 한번만 해주면 됨, 잠금 해제하는 메모리 범위에 포함된 모든 페이지들은 같이 잠금이 해제됨

    int munlockall (void)


    * 페이지 잠금은 fork에 의해 상속 받지 않는다


    페이지 잠금 호출 :

    int mlock (const void *addr, size_t  len)

    int mlockall (int flags)


    해제 호출 :

    int munloock(const void *addr, size_t len)

    int munlockall (void)


    int mlock (const void *addr, size_t  len)

    지정 된 메모리 주소 addr로 부터 len 길이만큼 페이징 금지

    int mlockall (int flags)

    해당 프로세스의 모든 메모리의 페이징을 금지하고, flag에 두 개의 지정 가능한 이수를 가짐

    - MCL_CURRENT 현재 상태에서의 프로세스에 대응된 모든 페이지를 잠근다.

    - MCL_FUTURE 앞으로 발생하는 모든 대응된 페이지를 잠근다. ( 새로운 메모리맵, 공유 메모리, 힙, 스택 모두에 대해서 적용된다 )