2013년 12월 10일 화요일

우분투 개발준비 - update 서버 바꾸기

sudo gedit /etc/apt/sources.list

검색목록에서 바꾸기 선택 후

기존서버주소를

http://ftp.daum.net/ubuntu/로 모두 바꾸어 주면된다.

 가끔 다음서버가 다운되는 경우

 http://ftp.neowiz.com/ubuntu

 위의 주소를 사용하도록한다. 

2013년 10월 1일 화요일

쓰레드에 arg인자 받을때warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]

sol:

 pthread_create(&func_node_thread, NULL, NodeInfoThread, (void*)Socket);


 void    *NodeInfoThread(void *_sock) {

         int sock = *(int *)_sock;


       

        int sock = (int) ((void*) _sock); <- 컴파일시 오류는 안나지만 원하는 결과를 못얻는다.. 주의

C표준은  int를 void*로 또는 그 반대로 캐스팅을 때의 결과를 정의하지 않았다. 하지만 대부분의 C 컴파일러는 이런동작을 허용하고 원하는 결과를 내놓는다.

2013년 9월 15일 일요일

multithread good example(link)

http://mmanoba.wordpress.com/2011/07/18/c-program-linux-posix-multithread-multitasking-example/

2013년 9월 12일 목요일

linux- eclipse 에서 thread 컴파일 안될때

right click on the project in the project explorer
-> properties
-> c/c++ build
-> Settings
-> linker
-> libraries
-> add
 -> pthread
-> ok

-> rebuild

path는 안잡아줘도 되더이다. 만약에 아규먼트 error가나면 (pthread_create invalid arguments...) 가 뜬다면 이것은 이클립스 문제가 아니라. 코드문제!! 다른부분들을 예제에 맞추어 잘했다면.. 오류가 나지 않겠지만 위와같은경우 대부분 마지막 파라미터값이 문제가된다. thread로 사용할 함수의 인자를 아래와 같이
비어두게되면 error가난다. void* thread(void*) 와 같이 파라미터를 명시해주어야 한다.!!

2013년 9월 4일 수요일

유닉스/리눅스 시스템 프로세스(process) 메모리 배치

간단히 프로세스(process)는 실행중인 프로그램이다.

프로세스는 논리적으로 다음과 같은 세그먼트(segment)로 나뉜다.


-text:프로그램의 명령

-data:프로그램이 사용하는 정적(static) 변수

-heap: 프로그램이 실행 중에 추가로 메모리를 할당할 수 있는 영역

-stack: 함수가 호출되고 리턴됨에 따라 자라고 줄어드는 메모리 영역으로,
지역 변수와 함수 호출 연결 정보가 저장된다.

2013년 9월 3일 화요일

파일 디스크립터(File Descriptor)

I/O 시스템 호출은 파일 디스크립터를 통해 열려 있는 파일을 참조한다.

 파일 디스크립터는 보통 음수가 아닌 작은 정수이며, I/O 대상 파일의 경로명을 인자로 받는

open()을 통해 얻을 수 있다.

(유닉스 시스템은 디바이스를 비롯한 모든 종류의 파일에 I/O를 수행할 때 동일한 시스템 호출open(), read(), write(),close() 등을 사용한다.
 이는 커널이!! 응용 프로그램의 I/O요청을!! 대상 파일이나 디바이스I/O 를 수행하는 파일시스템이나 디바이스 드라이버 동작으로 적절히 해석한다.
  따라서 이 시스템 호출을!! 사용하는 프로그램은 어떤 종류의 파일도 사용할 수 있다.)

보통 프로세스는 셸에서 실행될 때 열려 있는 FD(file descriptor) 3를 물려 받는다.

descriptor 0 은 표준 입력(standard input)   - 프로세스가 입력을 받는 파일
descriptor 1 은 표준 출력(standard output) - 프로세스가 출력을 내보내는 파일
descriptor 2 은 표준 에러(standard error)   - 프로세스가 에러 메시지와 예외/비정상 상태 공지를
출력하는 파일이다.

대화형 쉘이나 프로그램에서 이들 세 descriptor는 stdin, stdout,stderr 파일에 해당된다.

우분투 키값(keycode)&& Event 정보 알아내기

#xev :xev느 X-Window에서 벌어지는 이벤트를 출력하는 명령이다.

X-Window상에서 xev를 실행하면 Testing 창이 하나 뜨는데 이창에서 동적하는 키보드 입력,
마우스이동, 마우스클릭드으이 정보를 얻을 수 있다.
-keycode 알아내기 명령을 실행하고 키보드의 키를 누르면 로그가 나오는데 여기서 키값을 알아낼수 있다.

keycode 'value'

PS: 하지만 원격 터미널 접속시 xev: unable to open display ''라는 문구가 뜨는 경우가 있다.
이 경우는 Xshell4에서 순정 접속시 나오는 메세지 이다. 현재 putty에서 X11설정후 Xming 조합으로 원격접속하고 있는데 putty에서는 잘 보인다.

2013년 9월 2일 월요일

우분투 12.04 c/c++ 이클립스(ecllipse) 개발환경 한방에 끝!!

sudo apt-get update && sudo apt-get upgrade

which gcc g++

둘중에 나오지않는 컴파일러가 있으면 설치한다.

sudo apt-get install g++

12.04(eclipse-indigo)
sudo apt-get install eclipse eclipse-cdt g++

13.04(eclipse kepler)
sudi apt-get install eclipse-cdt g++ or sudi apt-get install eclipse-cdt


bye

2013년 8월 23일 금요일

가변길이 패킷 테스트 소스(Variable-length packets sample source)

프로젝트가 끝나고 궁금해서 testcode 만들어봄!!메모리해제 어.떡.하.지!!

2013년 8월 19일 월요일

C/C++ 디폴드 인자 (default parameter)

디폴트인자는 함수를 호출할 때 인자를 생략하면 디폴트 값이 자동적으로 사용되도록 하는 방법이다.

이것을 사용하는 상황은 함수를 재사용할때 쓸수 있을 것이다.
디폴트 인자는 하나 혹은 모든 함수에 적용해도 상관없다.

코드 최적하 문서들을 찾아보면 함수에 인자의 갯수가 적을수록 함수를 호출하는데 있어서
오버헤드가 적다고 나와있다.

그렇다면 함수를 재사용할때 변동되지 않는 인자를 디폴트인자로 설정해 놓는다면 그만큼 넘겨야되는 값이 적기 때문에 효율적이게 될 것이다.

이제 디폴트 인자를 사용하는 예를 살펴보자.

 


#include "stdafx.h"
#include 

using namespace std;

enum INT_TYPE{
 DECIMAL,
 OCTAL,
 HEXADECIMAL,
};

void PrintArray(const int arr[], int size = 5, INT_TYPE type = DECIMAL);

int _tmain(int argc, _TCHAR* argv[])
{
 int arr1[] ={10, 20, 30, 40, 50};
 int arr2[] ={10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
 
 //디폴트 인자는 오른쪽 인자부터 지정한다.
 PrintArray(arr1); 
 PrintArray(arr1, 5, HEXADECIMAL);
 PrintArray(arr2);
 PrintArray(arr2, 10);  

 return 0;
}

void PrintArray(const int arr[], int size , INT_TYPE type ){
 cout.setf(ios::showbase); //일단은 정수를 출력할 때 진법 정보를 함께 출력하는 기능! 

  for(int i=0; i<size; i++)
  { 
   switch(type)
   {
    case DECIMAL:  cout << dec; 
     break;
    case OCTAL:   cout << oct; 
     break;
    case HEXADECIMAL: cout << hex; 
     break;
   }
   cout.width(5);
   cout << arr[i] <<" ";
  }
  cout << endl;
}
 
결과:
 






위에서 사용한 디폴드 인자는 규칙이 있다.
1.디폴드 인자를 지정할 때의 규칙은 오른쪽 인자부터 지정해야 한다.
2.몇개를 하던 상관없다.
3.함수의 인자를 생랼할 때 함수의 가장 오른쪽 인자부터 생략해야된다.
4.인자를 생략할때 오른쪽 인자를 생략하지 하지않고 왼쪽 인자를 생략하는 것은 불가능하다.
5.인자 모두를 생략해도 된다.


C/C++ 매크로함수 vs inline 함수

C에서 C++ 의 inline 함수와 비슷하게 사용되는 것이 바로 매크로 함수이다.

매크로 함수도 함수 호출 시 발생하는 오버헤드 없이 함수가 호출되는 곳마다 함수의 내용을
복사해서 넣어준다. 하지만 매크로 함수는 실제로는 함수가 아니다. 매크로 함수를 정의 할 때는 # define 문을 사용하는데, #define 문은 컴파일 전 단계인 선행처리기(preprocessor)에서 처리된다. 선행처리기는 소스 파일의 텍스트를 읽어 컴파일되기 위한 파일로 준비하는 기능을 제공하는데 그 중 #define문은 소스 파일 내의 특정 문자열을 찾아서 문자열로 대치(replace)하는 기능을 제공한다.

!! 매크로 함수는 선행처리기에 의한 문자열 대치 방식으로 호출될 코드를 삽입하지만, 인라인 함수는 컴파일러에 의한 코드 대치 방식으로 호출될 코드를 삽입한다.

문자열 대치 코드대치.. 무슨소리냐!!?? 느낌은 알겠는데 잘 모르겠다..

예제를 살펴보자.



 

#include "stdafx.h"
#include 

using namespace std;

#define ADD(x,y) ((x)+(y)) //x + y
#define MUL(x,y) ((x)*(y)) //x * y

inline int Add(int x, int y);
inline int Mul(int x, int y);

int _tmain(int argc, _TCHAR* argv[])
{
   cout << MUL(10+20, 30+40) << endl;
   cout << Mul(10+20, 30+40) << endl;

   cout << ADD("abc",10) << endl;
   //cout << Add("abc",10) << endl;

   return 0;
}

inline int Add(int x, int y){
   return x + y;
}

inline int Mul(int x, int y){
   return x*y;
}

위의 코드는 매크로와 inline 함수를 사용하였고
정상적 으로 컴파일된다.(//주석된 부분으로 코딩한다면 어떤 결과가 나올까?)
 
여기서 봐야 될 부분은 더하는(Add) 부분이다.
이전에
 
매크로는 문자열대치
인라인은 코드대치
를 한다고 하였다.
 
 
매크로는 멍청한!? 선행처리기가 #define한 부분을 그대로 문자열을 대치하기 때문에
인자의 형검사를 하지않는다. 그렇기 때문에 오류없이 컴파일 되지만 원하지 않는 값을
얻게 될 수 있다.
 
Inline 함수는 똑똑한 컴파일러가 일반함수를 호출할 때처럼 인자의 값들을 계산하고 다음
호출이 수행된다.
 
C표준에는 없던 inline 함수가 C99에 포함되있는 것도 위와같이 여러가지(산술문제 등.)면에서
좋다라고 생각한다.
 
그렇기 때문에 이둘은 선택의 문제가 아니라 inline이 진보된 기술이기 때문에 앞으로 간단한 함수를 매크로로 만들던 것을 inline으로 사용해야 하면 더욱 안정적이라 할수 있겠다.

2013년 8월 18일 일요일

C/C++ 시간 있을때 기초부터 다시!!

입사후 첫 프로젝트를 하다가 멘붕이와서 다시 공부하려 한다.

진짜 C++ 문법을 쓰기 하기위하여!! 잠시 안녕 C야..