개요 리눅스(및 대다수의 운영체제)에서는 시스템에서 함께 동작하는 다수의 어플리케이션 프로세스 간에 정보를 교환하도록 하기 위한 프로세스간 통신 (Inter Process Communication, IPC) 기법을 제공합니다. 본 글에서는 여러 IPC 기법 중 메시지큐를 이용하여 프로세스 간 정보 교환 기능을 구현하는 예제를 소개합니다. 메시지큐 기반 IPC 기법의 대략적인 구조 및 동작 절차는 다음과 같습니다. 임의의 프로세스에서 메시지큐를 생성합니다 - msgget() 시스템 함수 호출 그 외 프로세스에서는 해당 메시지큐를 엽니다 - msgget() 시스템 함수 호출 수신 프로세스에서는 메시지큐로부터 메시지를 수신합니다 - msgrcv() 시스템 함수 호출 송신 프로세스에서는 메시지큐로 메시지를 송신..
본 글에서는 C 언어로 작성된 특정 라이브러리의 기능에 대해, google test를 이용한 단위테스트를 수행하는 샘플 프로젝트를 소개한다. 사용된 환경은 다음과 같다. 빌드 및 테스트 실행 환경: Ubuntu 리눅스 16.04 (도커 컨테이너) 단위테스트 툴: google test v1.10.0 빌드 툴: cmake v3.19.2 리눅스에 google test(v1.10.0)을 설치하는 방법은 아래 글에서 확인할 수 있다. 2020/12/31 - [프로그래밍/Google Test] - Google test 설치하기 리눅스에 CMake(v3.19.2)를 설치하는 방법은 아래 글에서 확인할 수 있다. 2020/12/31 - [개발환경/CMake] - 리눅스에 CMake 설치하기 - 3.19.2 버전 개요 ..
본 글에서는 google test를 설치하는 방법에 대해 설명한다. 사용된 환경은 다음과 같다. 설치 환경: Ubuntu 16.04 (도커 컨테이너) Google test 버전: v1.10.0 (2020년 12월 30일 기준 최신 버전) Ubuntu 리눅스 상에서 다음 명령들을 사용하여 google test를 다운로드하고 설치할 수 있다. cd ~ apt update apt install build-essential wget cmake wget --no-check-certificate https://github.com/google/googletest/archive/release-1.10.0.tar.gz tar zxf release-1.10.0.tar.gz cd googletest-release-1.10...
GPSd는 다양한 GNSS 모듈로부터 입력되는 각종 정보를 처리하는 오픈소스 데몬으로써, 처리된 GNSS 정보를 다수의 다른 어플리케이션들이 사용할 수 있도록 제공하는 기능을 지원한다. 본 글에서는 GPSd가 제공하는 GNSS 정보들을 획득하여 처리하는 어플리케이션 프로그램을 작성하는 방법에 대해 소개한다. GPSd 데몬을 빌드하고 사용하는 방법에 대해서는 아래 글에서 확인할 수 있다. 2020/01/30 - [개발/임베디드 리눅스] - GPS 모듈을 이용하여 시스템시각을 UTC 시간에 동기화하는 임베디드 장치 구성하기 장치 상에 GNSS 모듈이 내장되어 있고, GPSd 데몬이 GNSS 모듈로부터 입력되는 정보를 정상적으로 처리하는 상태가 되면, 동일한 장치에서 동작하는 다른 어플리케이션들에서는 GPSd..
리눅스 프로그래밍 - 프로세스 종료 신호(SIGINT, SIGTERM) 후킹하기 본 글에서는 리눅스 어플리케이션 프로세스의 종료 신호를 후킹하여 원하는 동작을 수행하도록 하는 방법에 대해 소개한다. 보통 루프를 도는 어플리케이션 프로세스의 경우 Ctrl + C를 입력하여 프로세스를 종료하거나(foreground에서 동작하는 경우), kill 명령을 이용하여 프로세스를 종료한다(background에서 동작하는 경우). Ctrl + C를 입력하거나 kill 명령을 이용하여 프로세스를 종료하고자 할 때, 프로세스가 종료되기 전에 특정 동작을 수행할 필요가 있는 경우가 있다. (예: 시스템에 생성해 놓은 공용 자원 해제, 다른 프로세스와의 정보 교환, 디바이스 드라이버의 상태 변경 등) 이 경우, Ctrl + ..
timer_settime() 타이머를 시작하거나 중지한다. 해당 함수의 원형은 다음과 같다. #include int timer_settime(timer_t timerid, int flags, const struct itimerspec *new_value, struct ittimerspec *old_value); timerid로 식별되는 타이머를 시작하거나 중지한다. timerid는 timer_create()를 통해 생성된 timer 식별자이다. 함수 호출자는 타이머 첫 만기 시점 및 반복주기를 new_value에 설정해야 한다. ittimerspec 구조체의 형식은 다음과 같다. struct timespec { time_t tv_sec; // 초값 long tv_nsec; // 나노초값 } struct ..
Google Test : 테스트 결과 레포트 만들기 본 글에서는 Google Test 를 사용하여 수행한 단위테스트 결과를 레포트 형식으로 만드는 방법에 대해 설명한다. 테스트 결과 레포트를 만들기 위해서는 다음 단계를 거치면 된다. 테스트 수행 시 "--gtest_output=xml:파일명" 옵션 사용 → XML 형식의 결과 파일 생성 레포트 생성 툴을 이용하여 레포트 파일을 생성 → XML 형식의 결과 파일을 HTML 형식의 레포트 파일로 변환 레포트 파일을 웹 브라우저에서 확인 본 글에서 사용된 환경은 다음과 같다. Ubuntu 16.04 리눅스 Google test : googletest-release-1.8.1 레포트 생성 툴 : GTestReport 또는 gtest-report-prettify..
C 프로그래밍 : 두 GPS 좌표간 목적지 방위각(bearing) 계산하기 본 글에서는 C 언어를 이용하여 하나의 GPS 좌표에서 다른 GPS 좌표로의 목적지 방위각(bearing)을 계산하는 방법에 대해 설명한다. GPS 좌표 중 도 단위 위도(latitude) 값과 경도(longitude) 값을 이용하여 특정 좌표로부터 또 다른 좌표로의 목적지 방위각(bearing)을 계산할 수 있다. 목적지 방위각(bearing)은 "특정 객체의 진행방향과 또다른 객체 사이의 각도" 또는 "정북(True North)와 타겟좌표 사이의 각도"를 의미하며, 본 글에서의 의미는 후자이다. 본 방법에서는 계산을 위해 삼각함수가 사용되므로 math 헤더파일을 인클루드해야 한다. 목적지 방위각(bearing)을 구한는 함수는..
C 프로그래밍 : 두 GPS 좌표간 거리(distance) 구하기 본 글에서는 C 언어를 이용하여 두 GPS 좌표간의 거리를 구하는 방법에 대해 설명한다. GPS 좌표 정보 중 도 단위 위도(latitude) 값과 경도(longitude) 값을 이용하여 두 좌표 사이의 거리(distance)를 계산할 수 있다. 본 방법에서는 거리 계산을 위해 삼각함수가 사용되므로 math 헤더파일을 인클루드해야 한다. 두 좌표 간 거리를 구하는 함수는 다음과 같이 구현할 수 있다. #include /// 계산에 사용되는 파이 값 #define PI 3.14159265358979323846 /** * @brief 소수점 도(decimal degree)를 라디언(radian)으로 변환한다. * @param[in] deg 변..
리눅스 네트워크 프로그래밍 - CAN(Controller Area Network) 통신 본 글에서는 차량 내부에서 사용되는 CAN(Controller Area Network) 통신을 수행하는 리눅스 어플리케이션 프로그램을 작성하는 방법을 설명한다. 환경은 다음과 같다. CAN 인터페이스에 대한 디바이스 드라이버 등은 BSP 레벨에서 이미 포팅이 되어 있다. CAN 네트워크에서 장치 간 공통으로 사용되는 baudrate 등 타이밍 관련 설정은 완료되어 있다. 어플리케이션 프로그램은 C 언어로 작성된다. CAN 인터페이스 초기화 C 언어로 작성된 어플리케이션 프로그램 상에서 CAN 인터페이스를 초기화하는 절차는 다음과 같다. socket() 함수로 CAN 인터페이스에 대한 소켓 파일 디스크립터를 연다 ioc..
리눅스 네트워크 프로그래밍 - UDP6(UDP over IPv6) 송수신 본 글에서는 리눅스 시스템 상에서 IPv6 프로토콜을 통해 UDP 데이터그램(이하 UDP6)을 송수신하는 프로그램의 작성 방법을 소개한다. UDP6(UDP over IPv6) 데이터그램 송신 프로그램 C 언어로 작성된 프로그램 상에서 UDP6 데이터그램을 송신하는 절차는 다음과 같다. 소켓을 연다 - socket() 시스템콜 호출. 소켓을 송신용 네트워크 인터페이스에 연결(bind)한다 - setsockopt() 시스템콜 호출. 목적지 정보(IPv6 주소, UDP 포트번호)를 설정한다. UDP 패킷을 전송한다 - sendto() 시스템콜 호출. 다음은 UDP6 데이터그램을 송신하는 예제 프로그램의 소스 코드이다. #include #..
본 글에서는 리눅스 시스템의 네트워크 인터페이스를 C 언어로 작성된 프로그램 상에서 비활성화하는 방법을 설명한다. 반대로, 활성화하는 방법은 다음 글에 설명되어 있다. 2020/02/15 - [프로그래밍/리눅스 프로그래밍] - 리눅스 네트워크 프로그래밍 - 네트워크 인터페이스 활성화하기 리눅스 시스템에서 네트워크 인터페이스를 비활성화하기 위해 보통 ifconfig down 명령을 사용한다. 아래 내용은 ifconfig eth0 down 명령을 이용하여 eth0 라는 이름을 갖는 네트워크 인터페이스를 비활성화 하는 내용이다. root@10a25d934dda:/workspace# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02 inet addr:172..