본문 바로가기

분류 전체보기

(728)
OS 별 select() 함수 사용법 [1. 개요]select() 함수는 비동기 I/O 처리를 위한 시스템 콜이다.여러개의 파일 디스크립터(보통 소켓) 을 동시에 감시하면서, read/write/error 등의 상태를 체크한다. 함수 원형은 아래와 같다.int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); timeval 구조체의 내용을 채워, I/O 상태 변화를 timeout 동안 기다리고,NULL 이면, blocking 으로 동작하고,NULL 이 아니지만 0으로 채워져 있으면, non-blocking 으로 동작한다.[2. 주의점]위 함수 사용 시 주의할 점은 첫번째 파라미터이다.리눅스 커널에서는, readfds ,..
mysql. master-slave 구성 [1. 개요]mysql db 서버 운영 시, master-slave 구성을 통해 아래와 같은 장점 등을 확보read / write 분리를 통한 부하 분산데이터 백업 및 복구master 장애 시, slave 를 통한 고가용성master-slave 구성을 위한 작업은 아래와 같은 순서로 진행.master 서버에서, replication 권한을 갖는 계정을 생성.master 서버에서, replication 을 위한 conf 파일 수정 master 서버에서, replication 할 database dump 수행slave 서버에서, replication 을 위한 conf 파일 수정slave 서버에서, master 에서 dump 한 파일을 이용하여 복구 진행slave 서버에서, master 서버 접속 정보 설정 ..
리눅스 공유 라이브러리에 관하여 [1. 개요].so 파일을 참조하는 application (c++ 으로 작성 된 혹은...) 은 런타임 시,필요한 공유 라이브러리를 로드하여 사용하는데, 이 때, 시스템 상 미리 정의 된 위치에서 필요한 라이브러리를 찾는다. 아래와 같은 명령어를 통해, 사용하고자 하는 app 이 참조하는 라이브러리 목록을 확인 할 수 있다.$ ldd $(which curl) 문제는, 필요한 라이브러리를 찾지 못하는 경우, app 실행이 되지 않는 것이며,여기서는 이러한 문제를 해결하기 위하여 해야 할 조치를 정리한다.[2. 기본적으로 찾는 경로]가장 단순한 방법은 시스템이 기본적으로 찾는 위치에 사용 할 라이브러리를 위치시키는 것이다. 32bit 프로그램은 아래와 같고/lib/usr/lib/usr/local/lib64..
구조체 대입 연산 [1. 개요]구조체 간 대입 연산 시 생각 해 볼 만한 부분?별도로 복사 생성자나 대입 연산자 등을 구현하지 않으면, 컴파일러가 디폴트로 제공하는 것을 사용하게 되는데 멤버의 고정 길이를 갖는 배열이 있다면?Q) 얕은 복사가 발생하지 않나?A) 배열의 이름은 배열의 시작 주소를 포현하는 포인터이지만, 배열의 이름은 수정 할 수 없는 값이다. 따라서, 컴파일러는 고정 길이의 배열을 대상으로 깊은 복사를 하도록 디폴트 메소드를 제공한다. 어떻게 구현할지는 컴파일러 마다 다를 수 있음. (단, 배열은 그 크기를 아므로 memcpy 를 통해서 할 수 도 있다...)[2. 예제]#include #include struct Mystruct { int A; int B; ..
Segmentation fault 사례4 [1. 개요]보통 배열에 대한 for 문은 0 ~ n 까지 증가하는 방식으로 작성하는 경우가 많은데,반대로, n ~ 0 까지 감소하는 경우로도 (역 방향) 작성 할 수 있다. 이때, 실수 할 만한 부분은 아래와 같은 반복문이다.for (unsigned int idx=n-1; idx >= 0; idx--) { // something. // access arr[idx]} 문제는 변수 idx 의 자료형이 unsigned 라는 것이다.idx == 0 인 경우 배열 접근이 가능하나, 여기서 -1 을 하는 순간 -1 을 unsigned 로 해석하여 매우 큰 수가 되어 버린다.0xffffffff그래서, idx 가 0 보다 작아지는 경우는 절대 발생 할 수 없고, 매우 큰 번지 수를 참조하려는 비정상 상황이..
Segmentation fault 사례3 [1. 개요]힙 메모리 관련 하여, SIGSEGV 시그널 발생 사례 중...free(): invalid pointer 오류 발생하는 경우가 있음. 구체적인 상황은new[] 를 이용하여, 동적 길이의 배열을 생성해당 배열을 사용delete[] 를 이용하여 리소스 해제 => 이 때 오류가 발생하는데...문제는 gdb 를 통해서 delete[] 한 메모리 주소가 오염되었는지 확인해보았는데,최초 할당 시, 받은 주소였고,심지어, 해당 메모리에 접근하여 배열 내 값도 정상적으로 확인 할 수 있었음.즉, 아래와 같은 상황은 아니라는 것이다.double free 를 시도한다 던가...new[] 로 할당한 메모리를 단순히 delete 로 해제한다 던가...[2. 원인]위 상황에 대한 원인은 다른 힙 메모리에 발생한 o..
insert 방식에 대한 비교 [1. 개요]INSERT INTOINSERT IGONRE INTOINSERT INTO ~ ON DUPLICATE KEY UPDATEREPLACE INTO table 의 record 를 삽입하기 위한 각 방법의 차이점을 정리위 순서대로 삽입 속도가 빠름.[2. INSERT INTO]가장 기본적인 방법PK 나 unique key 가 중복 된 경우, 에러가 발생하며 삽입되지 않음.가장 빠른 방법[3. INSERT IGNORE INTO]PK 나 unique key 가 중복 된 경우, 경고가 발생하며 삽입되지 않음. [4. INSERT INTO ~ ON DUPLICATE KEY UPDATE]아래 쿼리에서 `id` 가 unique key 로 설정되어 있고,`id`=1 인 record 가 이미 있는 경우, 아래 쿼리..
Segmentation fault 사례2 [1. 개요]아래 세그멘테이션 폴트 사례는 오염 된 포인터 변수에 접근 시 발생함.엄밀하게 말하면 스택 오버플로우가 아니기 때문임.[2. 예제]#include #define MAX_LEN 5struct A { int arr[MAX_LEN]; int len;};class MyContainer {private: // 메모리 배치를 고려하면... A first; const int *bptr; const char *cptr; const float *dptr;public: MyContainer() { first.len = 0; bptr = new int[MAX_LEN]; cptr = new char[MAX_LEN]; dp..
리눅스. 스택 크기에 관한 고찰 [1. 개요]Segmentation fault 와 관련하여 고민한 내용 정리[2. 상황]특정 함수 진입 시, c++ 로 작성한 애플리케이션이 segmentation fault 발생과 함께 죽는 현상.gdb 로 디버깅 시, 함수 진입 만 하였는데, segmentation fault 가 발생. 의심이 것 중 하나는 스택 오버플로우..[3. 예제] 1 #include 2 3 4 void myfunc() 5 { 6 char arr[MYSZ * 1024 * 1024]; 7 std::cout  ulimit -s 가 8192 (8 Mbyte 인 경우)g++ main.cpp -g -DMYSZ=9g++ main.cpp -Wl,-z,..
gdb 사용 방법 (기초) [1. 개요]리눅스 C++ application 디버깅 시, 유용한 툴 인 gdb 의 기초적인 사용 방법을 정리한다. 기본적으로 breakpoint 를 걸고, 한줄 단위로 실행해보기 위해서 디버깅 심볼들이 필요하다.따라서, CMake 기준에서는최적화를 많이 하는 Release 빌드 보다는 Debug 빌드가 적합하다.아래와 같이, gdb 실행 시 심볼들을 찾을 수 없다는 메시지가 출력 된다. g++ 로 직접 빌드하는 경우라면, -g 옵션을 사용하고, 최적화는 하지 않도록 한다.[2. 기본적인 실행] 1 #include 2 3 int sum(const int a, const int b) 4 { 5 const int aa = a*a; 6 ..