2008년 3월 5일 수요일

xlc 컴파일러의 __VA_ARGS__ 사용 예



#define LOG_PRINT(level, ...) my_logprint(int level, __VA_ARGS__)

void my_logprint(int level, char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
...
va_end(ap);
}


위 코드에서 주의할 점은 매크로 정의 라인에서는 첫번째 파라메터 이후에 __VA_ARGS__ 가
오고 함수 정의에서는 두번째 파라메터 이후에 ... 이 온다는 것이다.

2008년 3월 3일 월요일

객체지향 용어 정리

1. Class - A class is a model of an entity or object.
2. Instance - An instance is a nonspecific actualization of the class.
3. Object - An object is a specific actualization of the class model, created at runtime, which uses the class as a template.
4. Message - A message is a specific behavior undertaken by the object, requesting the receiver to perform a behavior.
5. Method - Methods are the associated actions performed by an object when it receives the message.

2008년 2월 5일 화요일

각종 Unix 에서의 hostid 얻는 법

어떤 시스템에서는 hostid 라는 명령어가 있기도 하고 uname -i 형태로 얻을 수 있는 시스템도 있다. 이중 특정 시스템에서는 hostid 명령어가 올바른 값을 되돌리지 않기도 한다.

AIX (RS/6000,  PPC)    uname -m 결과의 하위 2글자를 제거 후 하위 8자리
HP                     echo `uname -i` 16op | dc

HP IA64                getconf CS_PARTITION_IDENT 실행 후 처음 4바이트
Linux                  /sbin/ifconfig ech0 | grep Hwaddr  6바이트 네트워크 어드레스
SGI                    echo `/etc/sysinfo -s` 16op | dc
SUN                    hostid

참조 : http://www.veritools-usa.com/hostid.htm

2008년 1월 16일 수요일

DB2 CLI 프로그램 trace file

~db2inst/sqllib/cfg/db2cli.ini 이 파일에 다음의 내용을 입력한다.

[COMMON]
Trace=1 ; trace 출력
TraceErrImmediate=1 ; 에러인 경우 즉시 출력
TraceComm=1 ; 통신 출력
TraceFileName=/tmp/clitrace.txt ; 출력 파일명
TraceFlush=1 ; 배출
TraceFlushOnError=1 ;
TraceTimestamp=1

2007년 12월 18일 화요일

AIX에서 Memory Leak 찾는 기법

환경변수를 이용하여 malloc, free 를 추적할 수 있다.

MALLOCDEBUG=report_allocations,output:/tmp/alloc_output.txt

프로그램이 실행되는 동안 위의 환경변수가 설정되어 있는 경우 /tmp/alloc_output.txt
파일로 alloc, free 되는 정보가 출력된다. 프로그램이 실행되는 동안은 alloc,
free 할때마다 그 기록을 메모리상에 가지고 있다가 종료가 되면 해제되지
않은 alloc 정보만 /tmp/alloc_output.txt 로 출력된다.

더 자세한 사항은 AIX 5L Version 5.3 General Programming Concepts: Writing
and Debugging Programs 에 나와 있다.

2007년 10월 30일 화요일

오라클 인스턴스 클라이언트(Oracle Instance Client) 설치

무엇,왜 : 만약 Pro*c으로 프로그램을 개발 하였다면 그것을 실행하기 위해서는 설치 플랫폼에 최소한 Oracle Client가 설치되어 있어야 한다. 하지만 번거롭다. 오라클 설치는 CD을 필요로 하고 용량이 많이 차지하며 X-terminal, root 권한을 필요로 한다. 이런 설치없이 독립적으로 동작하게 한다. 단지 필요한건 copy와 editor 뿐. (하지만 10g 이후 버전만 지원??)

어떻게: oracle instance client 을 오라클 홈페이지에서 받자.
여기서
Basic, SQL*Plus, SDK(개발자라면) 을 우선으로 다운받고 압축을 해제한다. (공통적으로 instanceclient_xx_y 폴더를 포함하고 있다)

환경 변수를 설정한다. 로그인 쉘 스크립트에 아래 환경 변수들을 각기 설정하자.

ORACLE_HOME,PATH, TNS_ADMIN : instanceclient_xx_y 경로로
NLS_LANG : AMERICAN_AMERICA.KO16KSC5601 혹은 적당한 값

다음은 tnsnames.ora 생성, 서버의 tnsnames.ora 을 복사해 와도 된다. 주의할 것은 tnsnams.ora 내용을 확인 할것.

주의: Pro*c 용 헤더파일은 없다. 만약 Pro*C 용 헤더파일들이 필요하다면 이 설치로는 부족하다. 오라클 패키지를 다운로드 받은 다음 선택설치로 선택하고 개발 및 Runtime, SQLPLUS 항목을 선택하고 설치하면 된다.

2007년 7월 25일 수요일

fork와 thread 조합에서 만난 버그

개발 플랫폼 정보: AIX 5.3, xlc,oracle Pr*C

프로그램은 conf 파일을 읽고 패스워드를 입력받는다.
DB 접속 테스트. daemon으로 동작하기 위해 terminal 종속을 끝는다.
fork를 호출하여 Process M, A, W 로 분기한다.

M - Master Process
A - Admin Process
W - Work Process

W 프로세스는 다시 pthread_create 을 호출하여 thread R, I, M 로 분리된다.

r - recv thread
i - Issue thread
m - monitor thread

thread 생성후 pthread_key을 사용하여 hsm세션을 정보를 thread별로 만든다.
(thread specific data)

버그는 W 가 임의 동작으로 죽은후 M이 W을 다시 fork 한 후 W가 pthread_key 로
저장하는 세션 정보에서 발생한다. W 가 만드는 r, i, m 스레드가 자신들이 각자
만든 값으로 설정되는 것이 아니라(즉, 각 스레드가 최소 한번은 pthread_setspecific()
함수를 호출해야 하나 그렇지 못한다). pthread_setspecific()은 한번만 이루어지고
pthread_getspecific()이 3번 호출되면 2번째 호출부터는 NULL이 리턴되는 것이 아니다.
정상적인 시나리오는 getspecific() 호출에 NULL이 리턴되고 setspecific() 호출로 값을
설정한다.

버그가 발생한 이유는 M이 W을 초기화할 당시 hsm 을 완전히 지우지 않았다.
M이 fork로 생성한 W는 M의 hsm 정보를 가지고 있다(이 말은 hsm에 대한 pthread_key
을 가지고 있다는 것과 같다).

W의 1번째 hsm 정보는 M의 hsm정보를 가져오고 이후 pthread_create는 동일한 pthread_key
로부터 어떤 가비지 값을 가져오는 듯 하다.

--> fork(), pthread_create()의 혼합사용에서 있어서, pthread_key(), pthread_get,setspecific()
사용시 대단히 fork() 이전에 pthread_key_t은 삭제되어야 한다.