Public/tip & tech 122

open vs fopen 속도 측정

보통의 경우 파일을 처리할때 open보다는 fopen을 사용한다. O_CREAT니 O_RDWR과 같은 옵션을 외우느니 그런 옵션이 내장되어 있어서 사용하기 편한 fopen을 사용한다. 습관의 차이일수도 있다.(보통은 open보다는 fopen을 먼저 접한다 ) 그런데 가끔은 open을 사용해야하는 경우도 있다. 파일을 빈번히 열고 닫을 경우 fopen보다는 open이 속도가 빠르기 때문이다. 정말로 그런지 테스트를 한번 해보았다. 첫번째 파일은 test_open.c로 open, close만 10,000,000번 한다. 두번째 파일은 test_fopen.c는 fopen, fclose만 10,000,000번 한다. 테스트는 test_open한번 실행하고 test_fopen실행하는 식으로 총 5번 시간을 측정했..

Public/tip & tech 2009.05.12

어려운 포인터....( use of cast expressions as lvalues is deprecated )

프로그램에서 특정 변수가 char형으로 사용했다가 특정 컴파일 조건에서는 unsigned short 형으로 동작을 한다. 그래서 이 변수가 사용되는 함수에서는 void *로 변수를 받아서 형변환을 해서 사용한다. 그런데 생각했던 것과 다른 값이 나오는 경우가 있었다. unsigned short 형으로 데이터가 동작할때 void 포인터로 받아서 포인터 값을 1만큼 증가시켜 다음 데이터 값을 가리키도록 해야 하는데 이것이 생각했던 것과는 다른게 동작을 한다. 쉽게 코드로 하면 ((unsigned short*)p)++; 이런식으로 하면 p가 +2( unsigned short 의 크기 )만큼 증가하기를 기대했는데 컴파일은 되는데 "use of cast expression!s as lvalues is deprec..

Public/tip & tech 2009.05.12

cast from pointer to integer of different size

32비트 머신에서는 warning 없이 잘 컴파일 되던 것이 64비트 머신으로 갔더니 cast from pointer to integer of different size 이런 메세지가 뜬다.. unsigned short int* 형을 unsigned int형으로 바꾸는 부분에서 발생한 warning인데 sizeof로 확인해보니 unsigned short int*가 64비트에서는 8byte 자료형이고, unsigned int는 4byte 자료형이라서 발생하는 문제였다. 그래서 unsigned int를 unsigned long int로 수정했더니 warning이 사라졌다.

Public/tip & tech 2009.05.12

64비트 머신에서

64 비트 머신에서 달라지는 변수의 크기 char : 1byte short : 2byte int : 4byte long int : 8byte ( 32 bit 머신에서는 4byte ) float : 4byte double : 8byte unsigned long : 8byte ( 32 bit 머신에서는 4byte ) 모든 포인터 : 8byte(2^64) ( 32 bit 머신에서는 모든 포인터 4byte(2^32) ) 32비트 머신일때와 64비트 머신일때 각각 컴파일 하기 위해 명시적으로 64비트 머신에서 컴파일 하기 : gcc -m64 -g -o test test.c 명시적으로 32비트 머신에서 컴파일 하기 : gcc -m32 -g -o test test.c

Public/tip & tech 2009.05.12

IT장애 왜 반복되는가?

[지디넷코리아]IT조직에게 ‘장애’는 두려운 존재다. 장애가 발생하는 경우 IT조직의 무능함을 질타하는 사용자 측의 비난을 만나게 된다. 들 불처럼 일어나는 장애에 대한 관심도 IT조직의 입장에서 부담스럽다. 그런데 이렇게 두려운 장애임에도 불구하고, 장애에 대응하는 일부 IT조직의 접근법은 나이브(naïve)하기 그지없다. 이들 IT조직들은 장애의 직접적인 발생원인을 찾아내는 데에만 집중할 뿐, 장애가 발생하게 된 다양한 원인들을 찾아내는 활동은 게을리하고 있다. 장애에 대한 단순한 대응은, 유사한 원인으로 인한 장애의 재발을 막을 수가 없다. 단순한 장애 대응으로 IT장애를 반복하고 있는 IT조직에 대해서 이야기 해보겠다. ■ 장애 대응의 사례 A회사 IT조직의 장애 기록을 검토하면서 발견한 장애 대..

Public/tip & tech 2009.04.17

strchr()

strchr() 두 가지 버전이 있다. const char * strchr ( const char * str, int character ); char * strchr ( char * str, int character );VC++ 2005에서 char* isDigit(char _nextChar) { return strchr("0123456789", _nextChar); } 이렇게 하면 아래와 같이 에러가 난다. error C2440: 'return' : 'const char *'에서 'char *'(으)로 변환할 수 없습니다. 그러면 두 가지 방법이 있다. 하나는 isDigit() 함수의 리턴형을 const char*로 바꿔주던가(위에 첫번째 프로토타입처럼) 아니면 아래와 같이 하는 방법이 있다.(위에 두..

Public/tip & tech 2009.04.13

C++ Programming HOW-TO

C++ Programming HOW-TO Al Dev (Alavoor Vasudevan) alavoor (at) yahoo.com 정지용 ways (at) gon.kaist.ac.kr 이 문서는 C++에 관한 URL과 C++ online 책에 대한 링크, C++ 프로그래밍 팁 등을 포괄적으로 제공한다. 이 문서는 C++에서 겪는 다양한 메모리 관련 문제를 해결해주는 Java와 비슷한 library도 제공한다. 이 library를 이용하면, java 소스코드를 C++로 컴파일 할 수도 있다. 이 문서는 "C++ 언어의 집"역할을 한다. 이 문서에서 제공되는 정보는 C++ 언어를 적절히 사용하고 모든 운영체제 - 리눅스, MS-DOS, BeOS, Apple Macintosh OS, Microsoft Wind..

Public/tip & tech 2008.07.08

Wait Child process termination & Zombi process

부모프로세스는 자식 프로세스 종료에 대해 정보를 얻고 싶다. (왜 죽었나, 에러가 있었나 등등..) 그래서 자식이 종료될 때 좀비로 만들어 부모 프로세스가 자식의 상태를 체크할 수 있도록 해준다. 소위 waiting on zombie process라고한다. 종료된 자식 프로세스를 기다려 상태를 얻어오는 함수가 wait()인데 아래같이 생겼다. #include #include pit_t wait(int *status); 이 함수를 실행하면 자식이 죽을 때까지 블럭 된다. 종료될 때 받은 status값을 아래 매크로?함수?를 통해 상태를 파악할 수 있다. int WIFEXITED(status) : 정상 종료인지 int WEXITSTATUS(status) : 종료시 상태값 (0, 에러...) int WIFSI..

Public/tip & tech 2008.06.24

Resource Limits

시스템의 리소스 제한값을 보거나 설정하는 것은 아래 함수를 통해 할 수 있다. #include #include struct { rlim_t rlim_cur; // soft rlim_t rlim_max; // hard }; int getrlimit(int resource, struct rlimit *rlim); int setrlimit(int resource, const struct rlimit *rlim); 리소스 제한 값에는 soft limit과 hard limit 두가지가 있는데, soft limit는 hard limit 한도내에서 자유롭게 변경할 수 있다. 각 값들은 0인 경우 disable이고, RLIM_INFINITY(-1) 인 경우 무한대이다. limit 값들의 flag 이름들은 아래와 같다...

Public/tip & tech 2008.06.24

Threads Condition variable

Thread를 동기화하는 다른 방법 중의 하나로 Condition variable을 사용하는 것이 있다. condition variable을 잘 사용하면 race-free한 thread 코드를 만들 수 있다. condition variable자체는 mutex 에 의해 보호된다. 때문에 condition 상태를 바꾸기 위해서는 먼저 mutex lock을 걸어줘야한다. condition variable(이하 cv) 초기화는 두가지 방법이 있는데, cv가 static이면 PTHREAD_COND_INITIALIZER를 넣어주면 되고 dynamic 이면(동적 할당되었으면) pthread_conf_init()을 쓰면된다. 사용이 끝나면 pthread_cond_destroy()를 호출해준다. #include // 0..

Public/tip & tech 2008.06.24