C++ 25

[Boost] 문자열 다루기

boost 에서 문자열을 다루는 방법을 알아본다. boost::lexical_cast 정수형 실수형 값을 문자열로 바꾸거나 반대로 문자열을 정수형, 실수형 값으로 변환할 때 사용한다. 기본 사용 문자열에서 값으로 변환하기, 타입으로 넘겨준다. auto i = boost::lexical_cast("100"); char chars[] = { 'x', '1', '0', '0', 'y' }; auto i2 = boost::lexical_cast(chars + 1, 3); 해당 변수에 담을 수 없는 값으로 변환하거나 변환이 불가능하다면 boost::bad_lexical_cast를 던진다. try { auto sh = boost::lexical_cast("100000"); } catch (const boost::b..

C++/Boost 2022.08.21

[Boost] thread

boost thread 사용법을 알아본다. 대부분의 기능은 C++11에 표준화되어 헤더에 포함되어 있다. 필요 헤더 #include thread 사용하기 static bool is_first_run() { return true; } static void fill_file(char fill_char, std::size_t size, const char* filename); static void p_example() { if (is_first_run()) { boost::thread(boost::bind(&fill_file, 0, 8 * 1024 * 1024, "save_file.txt")).detach(); } } 실행하고자 하는 함수를 전달하여 스레드를 만들어 실행하도록 한다. detach()는 프로그램..

C++/Boost 2022.08.21

[Boost] any / variant / optional

boost::any C#, JAVA와 같이 모든 타입을 지칭할 수있는 타입을 제공한다. 필요 헤더 #include 모든 타입을 담을 수 있는 클래스 void example2() { boost::any variable(std::string("Hello World!")); // if casting failed, may throw boost::bad_any_cast string s1 = boost::any_cast(variable); // if casting failed, s2 is null string* s2 = boost::any_cast(&variable); } 값에 대한 any_cast는 타입이 맞지 않을 시 boost::bad_any_cast를 던진다. 포인터에 대한 any_cast는 null로 대체..

C++/Boost 2022.08.20

[Boost] program_options

boost의 program_options을 사용해본다. 프로그램 시작 인수를 ./program.exe --option=value 과 같이 실행하고 필요 정보를 출력할 수 있게 해준다. 필요 헤더 #include 사용 방법 1. options_description 개체를 정의를 해준다. 2. 프로그램 인수를 파싱한다. 3. 프로그램 인수를 적용한다. 특징 options_description의 add_option()을 할 때 인수를 필수로 지정하거나 기본값을 지정하는 등을 할 수 있다. ./program.exe --help를 통해 옵션 정보를 출력할 수 있다. .cfg 파일을 통해 인수를 설정할 수 있다. #include "global.h" #ifdef _DEBUG #pragma comment(lib, "l..

C++/Boost 2022.08.20

[Boost] 라이브러리 설치

C++ 고급 기능을 사용할 수 있는 boost 라이브러리를 설치해본다. https://www.boost.org/ Boost C++ Libraries Welcome to Boost.org! Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work well with the C++ Standard Library. Boost libraries are intended to be widely useful, and usable across a broad spectrum of applications www.boost.org 공식 사이트 기준 boost 1.80.0 버전을 사용할 수 있다. 라이브러리 소..

C++/Boost 2022.08.20

(6) Pthread 쓰레드 / PMutex 뮤텍스

Pthread 사용하기 gcc -pthread thread_example.c -o thread_example.o -pthread 플래그로 링크해야한다. 스레드 생성하기 #include int pthread_create(pthread_t* thread, const pthread_attr_t *attr, void* (*start_routine) (void*), void* arg); thread : 생성된 스레드 ID를 반환 attr : 새로 생성할 스레드의 속성을 지정 start_routine : 스레드가 수행할 함수 arg : 수행할 함수에 전달될 인자 스레드 종료 및 취소 void pthread_exit(void* retval); int pthread_cancel(pthread_t thread); 스레드..

C++/linux 2022.05.12

(5) 프로세스 관리

프로세스 실행 중인 프로그램을 지칭. 메모리에 적재된 바이너리 이미지, 가상화된 메모리 인스턴스, 열린 파일, 커널 리소스, 사용자 정보, 하나 이상의 스레드를 포함한다. 프로세스 ID 프로세스 ID(pid)는 유일한 식별자로 구분된다. 커널이 실행하는 idle 프로세스의 pid는 0이다. 시스템 부팅이 끝나면 커널이 실행하는 최초의 프로세스 init 프로세스의 pid는 1이다. init 프로세스 init 프로세스는 다음 순서대로 경로에서 찾아 먼저 찾은 프로세스를 실행한다. /sbin/init : 가장 먼저 찾는 init 프로세스 /etc/init : 두번째로 찾는 init 프로세스 /bin/init : 우선 탐색에 실패했을 때 찾는 init 프로세스 /bin/sh : 커널이 앞의 순서댈 init 프로..

C++/linux 2022.05.11

(4) 고급 입출력 readv/writev/epoll/mmap

벡터 입출력 한 번의 호출로 배열 형태의 입출력용 자료구조에 데이터를 한 번에 읽고 쓰는 것이 가능하다. 벡터 입출력 readv(), writev() #include ssize_t readv (int fd, const struct iovec *iov, int count); ssize_t writev (int fd, const struct iovec *iov, int count); 파일 디스크립터 fd로 부터 입출력용 자료구조 iovec에 데이터를 읽어드리는 readv() 그리고 iovec의 데이터를 한 번에 쓰는 writev 함수가 있다. 호출이 성공했을 시 읽거나 쓴 바이트 수를 반환한다. 에러가 발생했을 시 -1을 반환. 벡터 입출력용 자료구조 iovec iovec* 은 결국 여러 버퍼의 시작 주소와..

C++/linux 2022.05.10

(3) 버퍼 입출력

파일 포인터 FILE* (파일 스트림)로 표준 입출력 하기 파일 열기 fopen() FILE* fopen(const char* path, const char* mode); 모드 mode "r" : 읽기 모드 "w" : 쓰기 모드 "a" : 덧붙이기 모드 "r+", "w+", "a+": 읽기/쓰기 모드 모두 지원 성공 시 유효한 파일 포인터 반환, 실패 시 NULL을 반환. 파일 디스크립터를 통해 스트림 만들기 fdopen() FILE* fdopen (int fd, const char* mode); 반환된 파일 스트림은 파일 디스크립터와 연결된 입출력을 제공한다. 파일 스트림을 닫으면 파일 디스크립터도 닫힌다. 스트림 닫기 fclose() int fclose (FILE* stream); 성공 시 0, 실패..

C++/linux 2022.05.10

(2) 다중 입출력 select와 poll

다중화된 입출력 파일 디스크립터에서 발생하는 입출력 이벤트를 확인하는 방법에 대해 알아본다. 동기화된 다중 입출력 메커니즘 select() #include int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); n : 감시하는 파일 디스크립터 중 가장 큰 것에 +1을 한 값 readfds : 읽기를 감시하는 파일 디스크립터 집합 writefds : 쓰기를 감시하는 파일 디스크립터 집합 exceptfds : 예외가 발생하는 지 감시하는 파일 디스크립터 집합 (주로 소켓) timeout : 타임 아웃 시간 성공 시 입출력이 준비된 fd 개수를 반환한다. 타임 아웃시 0을 반환, 에러 시 ..

C++/linux 2022.05.10