CLion은 IDE 창 내에서 사용할 수 있는 터미널 기능을 제공한다. 아래와 같이 편집창 하부에 터미널 창을 열어서 각종 작업을 수행할 수 있다. (창의 위치는 변경 가능하며, 편집창과 동일하게 독립적인 창으로 분리할 수도 있다) 현재 진행 중인 프로젝트에서는, CLion을 이용해서 코드를 작성하고 터미널 창(리눅스 도커 실행)에서 빌드를 수행하고 있다. 종종 스크립트를 수정하기 위해 vi 에디터를 사용하는데, 편집 후 저장을 하고 vi 에디터를 빠져 나오려면 Escape(ESC) 키를 눌러야 한다. 그런데, CLion의 터미널 창은 기본적으로 Escape(ESC) 키가 편집창으로 포커스를 전환하는 기능에 대한 키로 지정되어 있어, 터미널에서 실행중인 쉘에 ESC 키 입력이 전달되지 않는다. 즉, vi..
리눅스 프로그램에서 시그널(인터럽트) 처리 방식이 아닌 쓰레드 방식의 타이머를 사용할 수 있다. 쓰레드 방식의 타이머를 사용할 경우, 타이머 만기 시에 해당 이벤트를 처리할 수 있는 쓰레드가 생성되므로, 해당 쓰레드(=타이머 만기 처리루틴) 내에서 뮤텍스 등 프로세스 컨텍스트에서만 허용되는 지연 발생 동작을 수행할 수 있다는 장점이 있다. 타이머를 생성하기 위해 timer_create() 호출 시, 인자로 전달하는 sigevent 구조체의 sigeve_notify 변수의 값을 SIGEV_THREAD로 설정함으로써 쓰레드 기반의 타이머를 사용할 수 있다. 이 경우 타이머 만기 시마다, sigevent 구조체의 sigeve_notify_function 변수에 연결된 쓰레드 함수를 수행하는 쓰레드가 생성되며,..
리눅스에서 타이머 파일 디스크립터를 이용하여 쓰레드 기반의 타이머 이벤트 처리 기능을 구현할 수 있다. 타이머에 대한 파일 디스크립터를 생성한 후, 해당 파일 디스크립터를 읽거나 폴링함으로써 타이머 이벤트를 획득하여 처리할 수 있다. 사용되는 함수는 timerfd_create(), timerfd_settime(), read()이다. 대략적인 절차는 다음과 같다. 1. timerfd_create() 함수를 호출하여 타이머 파일 디스크립터를 생성한다. 2. timerfd_settime() 함수를 호출하여 타이머 만기 주기를 설정한다. 3. 루프를 돌면서 read() 함수를 호출하여 타이머 이벤트를 처리한다. read() 함수 호출 시 블록되며, 타이머 만기 시점이 되면 리턴된다. 타이머를 설정할 때, 최초 ..
어플리케이션을 개발하다 보면, 어플리케이션의 실행을 반복하면서(실행과 종료를 반복) 테스트하고 싶은 경우가 있다. 리눅스에서 이러한 작업이 필요하여, 다음과 같은 두 개의 스크립트 파일을 만들어 테스트를 진행해 보았다. 어플리케이션 실행용 쉘 스크립트 : 주기적으로 어플리케이션이 실행 중인지 여부를 확인하여 실행 중이 아닐 경우 어플리케이션을 실행한다. 어플리케이션 종료용 쉘 스크립트 : 주기적으로 어플리케이션이 실행 중인지 여부를 확인하여 실행 중일 경우 어플리케이션을 종료한다. 어플리케이션 실행용 쉘 스크립트는 다음과 같이 만들었다. 루프를 돌면서 2초마다 my_app이라는 어플리케이션이 실행 중인지를 확인하여, 실행 중이 아니면 실행한다. #!/bin/sh while : do echo "Check ..
Git에서 브랜치를 변경하려고 git checkout 명령을 입력하였더니 아래와 같은 에러가 발생하였다. error: packfile .git/objects/pack/pack-7765263443e82381c8090bcc3f4132f0e62fe895.pack claims to have 679 objects while index indicates 769 objects 해당 브랜치에서 아직 commit 하지 않고 Stash 해 놓은 변경 코드가 있었기 때문에, 공포를 느꼈다... 다행히 구글링을 통해 다음과 같이 해결하였다. 1. 일단 프로젝트 디렉토리를 백업한다. (다른 경로에 복사해 놓는다) → 최악의 상황을 방지하기 위해. 2. 에러가 출력된 각 pack 파일들에 대해 다음 명령을 실행한다. mv .gi..
본 글에서는 구글 번역 싸이트를 이용해서 문서 파일(docx, pdf, pptx, xlsx 파일)을 번역하는 방법을 설명한다. 구글 검색에서 "구글 번역"으로 검색한다. 검색된 Google 번역 싸이트로 이동한다. "문서" 버튼을 클릭하여 문서 번역 화면으로 이동한다. "컴퓨터에서 찾아보기" 버튼을 클릭하고 번역할 문서를 선택한다. 파일의 업로드가 완료되면 "번역" 버튼을 클릭한다. 번역이 시작되면 다음과 같이 "번역 중"으로 표시된다. 번역이 완료되면 "번역 다운로드" 버튼이 생성된다. "번역 다운로드" 버튼을 클릭하여 파일을 다운로드한다. 다음과 같이 번역된 것을 확인할 수 있다.
nanosleep()은 특정 시간 동안 프로세스/쓰레드를 재우는데(동작을 멈추는데) 사용된다. 개인적으로는 지금까지 마이크로초 단위의 함수인 usleep()을 많이 사용했는데(sleep() 함수가 초단위라서 너무 긴 경우에), 이번 기회에 nanosleep()으로 변경하게 되었다. 찾아보니, usleep() 대신 nanosleep()을 쓰는게 좋은 듯 하고 특히 nanosleep()은 POSIX 함수라고 한다. 인자로 단순히 마이크로초 단위의 시간값을 전달해 주는 usleep() 함수에 비해 nanosleep() 함수의 사용법이 아주 조금 더 복잡하긴 하지만, 사용하기 어려운 수준은 아닌 듯 하다. nanosleep()의 함수 원형은 다음과 같다. #include int nanosleep(const st..
CMake에서 링커 옵션을 지정해 주고자 할 경우 target_link_options() 커맨드를 사용할 수 있다. 특정 링커 옵션을 지정하고자 할 경우, 해당 링커 옵션을 다음과 같이 target_link_options() 커맨드 내에 그대로 적어주면 된다. target_link_options( [linker option]) 다음은 hello.c 파일을 빌드할 때 "-Wl,--hash-style=gnu -Wl,--as-needed"라는 링커 옵션을 주는 CMakeLists.txt 파일의 예시이다. set(TARGET_APP hello) add_executable(${TARGET_APP} hello.c) target_link_libraries(${TARGET_APP} PRIVATE pthread) tar..
Visual studio code(vscode)는 편집기 상에서 새로운 파일을 생성하거나 편집기에 열려 있는 파일을 업데이트 저장할 때, 저장되는 파일의 저장 형식을 지정할 수 있다. 정확하게는 EOL(End Of Line)이라고 불리는 줄 바꿈 문자를 지정할 수 있다. 줄 바꿈 문자(End Of Line, EOL)란? 텍스트 파일의 경우, 각 줄이 끝났음을(즉, 줄이 바뀌는 것을) 표시하기 위해 각 줄의 마지막에 줄 바꿈 문자(End Of Line, EOL)라고 불리는 특수문자가 추가로 저장된다. 이러한 줄 바꿈 문자(End Of Line, eol)는 공통으로 약속된 형식을 사용하게끔 되어 있어, 해당 텍스트 파일을 사용하는 시스템(장치)의 종류나 특성에 무관하게 동일하게 해석되어 사용될 수 있다. 다..
오픈소스 유틸리티인 GPSD에 버그가 있다고 한다. 정확히는 3.20 버전부터 3.22 버전까지 해당되며, GPSD를 이용하여 시스템 시각을 UTC에 동기화 시킬 때 버그로 인해 시간이 과거로 돌아가는 현상(Rollover)이 발생한다고 한다. GPSD가 워낙 많이 사용되어 영향력이 큰 탓인지, 미국 정부에서 이를 발표하였다. https://www.cisa.gov/uscert/ncas/current-activity/2021/10/21/gps-daemon-gpsd-rollover-bug 전문은 다음과 같다. Critical Infrastructure (CI) owners and operators, and other users who obtain Coordinated Universal Time (UTC) f..
개요 본 글에서는 CMake를 이용하여 빌드할 때, 특정 디렉토리를 다른 곳으로 복사하는 방법을 소개한다. 본 글에서 사용된 환경은 다음과 같다. CMake 실행 및 빌드 환경 : 우분투 리눅스 18.04 CMake 버전 : 3.13.2 CMakeLists.txt에 디렉토리 복사 명령문 작성하기 CMakeLists.txt 파일에 add_custom_command() 명령문을 작성하여, 타겟 빌드 시에 특정 디렉토리를 복사할 수 있다. add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${FROM_DIR} ${TO_DIR}) 위 명령문에서 작성자의 의도에 따라 변경될 수 있는 부분은 각각 다음과 ..
개요 본 글에서는 CMake를 이용하여 빌드할 때, 특정 디렉토리를 삭제하는 방법을 소개한다. 본 글에서 사용된 환경은 다음과 같다. CMake 실행 및 빌드 환경 : 우분투 리눅스 18.04 CMake 버전 : 3.13.2 CMakeLists.txt에 디렉토리 삭제 명령문 작성하기 CMakeLists.txt 파일에 add_custom_command() 명령문을 작성하여, 타겟 빌드 시에 특정 디렉토리를 삭제할 수 있다. add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_COMMAND} -E remove_directory ${DIR}) 위 명령문에서 작성자의 의도에 따라 변경될 수 있는 부분은 각각 다음과 같다. ${TARGET} : 빌드 타..