본문 바로가기

분류 전체보기

(774)
std::thread vs std::async
std::packaged_task [1. 개요]std::packaged_task는 C++11부터 도입된 기능으로, 함수나 함수 객체를 비동기적으로 실행시키고, 그 결과를 std::future를 통해 받아올 수 있도록 감싸주는 wrapper. 기본적으로 std::thread 로 실행 한 task 의 리턴 값을 받기 위한 별다른 메커니즘이 없다.std::promise 를 사용하는 것도 한가지 방법이기는 하지만,,,그러나, std::async 와 마찬가지로 task 의 리턴 값을 받기 위한 메커니즘을 제공한다는 측면이 있다.std::async 는 join() 을 따로 호출하지 않아도 되지만,std::thread 를 통해 호출하게 하므로, join() 의 호출은 필요 함.[2. 예제]가장 일반적인 사용 방법std::packaged_task 를 ..
samba 서버 설치 [1. 개요]파일 공유 서버를 구축하기 위해, SMB 프로토콜을 구현한 samba 를 설치하고, 운영하는 대략적인 방법을 정리한다. 환경Ubuntu 20.04redhat 계열...설치 순서samba 패키지 설치설정 파일 작성사용자 계정 등록데몬 재실행[2. samba 패키지 설치]# apt install samba -y -- 아래는 설치 확인을 위함# smbd --version# systemctl status smbd -- 아래는 optional (외부 접속이 필요한 경우 고려)# apt install smbclient -y[3. 설정 파일 작성]default 로 아래 위치에 설정 파일이 있음./etc/samba/smb.conf설정파일의 구성은대괄호를 기준으로 구분되며, 그 밑에 상세 설정을 기술한다.e..
std::bind [1. 개요]socket api 의 bind() 가 아니라, c++ 의 std::bind() 는 함수에 인자등을 미리 고정해서 함수 객체(callable) 를 만든다.아래와 같은 상황에서 주로 사용하는데,callback 을 등록 할 때,함수 객체 호출 시, 일부 인자를 미리 고정하고 싶을 때,다른 함수 객체들과 조합할 때,최신 C++ 에서는 lambda 식을 주로 사용하긴 하지만, 알아 둘 필요 있음.[2. 사용 방법 - 전역 함수]#include #include using namespace std;int add(int a, int b) { return a + b;}int main() { // add의 첫 번째 인자 10을 고정하고, 두 번째 인자는 나중에 받음 auto add10 = s..
bitfield 사용 시 유의할 점 [1. 개요]메모리를 bit 단위로 제어할 필요가 있을 때 사용하는 bitfield 에 대해서 사용 시 유의할 점.bitfield 멤버에 대해서 주소를 확인 할 수 없다. (주소연산 불가)비트 필드가 저장되는 순서 (MSB→LSB 등)는 플랫폼/컴파일러 의존적[2. 비트 필드가 저장되는 순서]Little-endian arch 에 g++ 컴파일러 기준으로 아래 예제를 실행하면,#include #include struct Mystruct { unsigned char a : 4; unsigned char b : 4;};int main(){ unsigned char c = 0x8f; Mystruct obj; memcpy(&obj, &c, sizeof(c)); std::cout 출..
std::stringstream [1. 개요] [2. 주의 사항]초기화 명목으로 보통 명명되는 clear() 함수는 stringstream 에서는 의도한 대로 작동하지 않는다.내부 버퍼를 초기화하는 역할로 동작하지 않음.stream 에서 clear() 함수는 보통, flag 등을 초기화하는 역할을 하기 때문...# failbit / eofbit 등.따라서, 내부 버퍼를 초기화 하려면, 아래와 같이 빈 문자열을 설정하도록 해야한다..str("");
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; ..