리눅스

리눅스

__attribute__ ((visibility("default"))) 관련

외부에 제공하는 API의 함수 정의 부분에 아래와 같이 EXPORT_API라는 부분이 있어서 메크로를 타고타고 들어가보니 아래와 같이 선언되어 있었고 실제로는 __attribute__ ((visibility("default"))) 라는 키워드가 있었다. #define EXPORT_API __attribute__ ((visibility("default"))) /*Tizen wifi-manager중 일부*/ EXPORT_API int wifi_manager_initialize(wifi_manager_h *wifi) 115 { 116 int rv; 117 118 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE); 119 120 if (wifi == NULL) { 121 WIFI_LOG(WIF..

리눅스

Unix Domain Socket

IPC를 위한 방법으로 파이프,메세지큐,세마포어,소켓등이 있다. 개발하려는 프로그램의 방향에따라 적적한 방식을 택하면 된다. 그 중 소켓을 이용한 IPC는 기존의 네트워크 통신 방식과 동일하다.(어짜피 네트워크 소켓도 프로세스간의 통신을 위한 것이기 때문에) 그래서 API사용에 있어서 좀더 익숙하고 기존의 네트워크 방식을 로컬방식으로 옮길때 코드상의 큰 수정없이 바로 적용가능하다. 그리고 양방향 통신을 위해 파이프방식 처럼 길을 두개 열어줄 필요가 없이 양방향 통신이 가능하다. 어느정도 규모가 있는 프로그램은 소켓을 이용하기를 추천하고 있다.(아마도 대부분 서버-클라이언트 구조라서 그러는 것 같음.) 뿐만아니라 로컬에서의 통신이기 때문에 UDP방식을 사용하더라도 패킷 유실의 걱정도 없다. 기존의 네트워크..

리눅스

[Linux] Daemon Process란?

학교 수업을 들을 때 "데몬 프로세스"라는 단어에 대해서 많이 들어봤지만 항상 궁금했던 점은 백그라운드에서 실행하는(UI)가 없는 프로세스와 도대체 무슨 차이가 있는거지 라는 궁금증이 있었다. 위키에 나온 데몬의 정의를 살펴보면 멀티태스킹 운영 체제에서 데몬(daemon, 발음: 데이먼/'deɪmən/ 또는 디먼 /'dimən/[1])은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다. 시스템 로그를 남기는 syslogd처럼 보통 데몬을 뜻하는 ‘d’를 이름 끝에 달고 있으며, 일반적으로 프로세스로 실행된다.데몬은 대개 부모 프로세스를 갖지 않으며, 즉 PPID가 1이며, 따라서 프로세스 트리에서 init 바로 아래에 위치한다. 데몬이 되는 방법은 일반적으로 ..

리눅스

[glib] 메인루프

대부분 GUI를 사용하는 앱들은 Event-Driven Architecture를 사용하고 있다. Event-Driven 방식은 메인루프에서 이벤트(터치,타임아웃 등)를 받아들이고 이벤트가 발생하면 등록된 핸들러를 이용해서 이벤트 처리 결과를 사용자에게 전달한다. 보통 메인루프는 한번의 iteration(?또는 사이클)을 돌면서 이벤트를 확인,처리한 뒤 idle상태로 들어간다.GNOME에서 만든 라이브러리 glib에서 main loop기능을 제공한다. glib의 g_main_loop를 사용하기 위해서는 우선 $ pkg-config --list-alllibecpg libecpg - PostgreSQL libecpg librarylibpq libpq - PostgreSQL libpq librarygio-uni..

리눅스

리눅스 signal

리눅스 환경에서 강건성(robustness)테스트나 디버깅을 진행하다보면 여러가지 오류로인해 프로그램이 종료된다. 이 때 코어덤프가 있으면 디버깅에 유용하지만 로그만 남아 있는 경우도 있다. 이럴때 단서가 되는 부분이 시그널인 것 같다. 그래서 시그널에 대해서 다시한번 상기시켜보려고 한다.(사실 주로 발생하는 시그널은 SIGABRT,SIGKILL,SIGPIPE,SIGSEGV 정도이다.) 시그널의 정의를 보면 시그널은 소프트웨어 인터럽트로, 프로세스에 어떤 이벤트가 발생했음을 알리는 간단한 비동기 메세지이다.인터럽트는 크게 하드웨어 인터럽트와 소프트웨어 인터럽트로 구분된다. 하드웨어 인터럽트는 외부에서 전기적 신호가 발생(이벤트)했을때를 말하고 소프트웨어 인터럽트는 CPU가 연산중에 어떠한 조건에 맞는 이..

리눅스

pthread에서 메모리 침범과 pthread_cancel

메인 스레드가 join을 통해 다른 스레드들을 기다릴 수 없는 상황이라면(join없이 detach를 통해 스레드가 독립적으로 일을 할 때) 프로세스를 종료하는 시점에 A 스레드가 전역변수를(또는 다른 스레드의 리소스) 접근 할 때 문제가 발생할 수 있다. (이미 해제 된 메모리를 접근 하려 하기 때문에 SIGSEGV나 SIGABRT가 발생 할 수 있음) 프로세스가 SIGTERM 시그널을 받았거나 앱라이프 사이클에서 terminate시점이라면 pthread_cancel을 통해 스레드들을 먼저 종료해주어야 한다.(+스레드에서 쓰던 메모리도 회수) [pthread_cancel 예제 코드] 12345678910111213141516171819202122232425262728293031323334353637383..

리눅스

정적 라이브러리(static library)와 공유 라이브러리(shared library)

동적라이브러리 충돌문제가 생겨서 라이브러리구조와 만드는 방법에 대해서 공부를 해보게 되었다. 우선 리눅스에서 라이브러리는 다른 프로그램에서 사용 할 수 있도록 미리 만들어진 하나이상의 서브 루틴이나 함수들이 모여있는 파일이다.라이브러리 종류는 정적 라이브러리(static library=>.a파일)와 공유 라이브러리(shared library=>.so파일)이 있다. 둘다 장단점이 명확하지만 주로 라이브러리는 배포하기 위한 목적성을 갖기 때문에 대부분 .so형태로 만들어서 사용 된다. 간단한 예제를 통해 계산기 기능을 가지고 있는 정적 라이브러리와 동적 라이브러리를 만들어 보자. [sum.h]#ifndef __SUM__H#define __SUM__Hint sum(int a, int b); #endif [su..

리눅스

Dead lock과 pthread에서 mutex lock하는 방법

공유자원(파일)에 대해서 pthread의 lock에 대해 알아보던 중 pthread_mutex_lock 외에도 pthread_mutex_trylock, pthread_mutex_timedlock이 있다는걸 알게되었다. 추가적으로 dead lock 가능성을 피하기 위해 잠시 dead lock에 대해 복습해 보면 dead lock 두가지 상황에서 발생할 수 있다. 1) A thread에서 mutex lock변수 a를 이용해서 lock을 진행한 상태에서 다시 a를 lock 하려고 할때 발생.(보통 재귀적으로 구현 된 함수에서 lock을 거는 경우 발생함) 2) A thread에서 mutex lock변수 a를 lock하고 B thread에서 mutex lock변수 b를 lock을 한 상태에서 A thread에서..

리눅스

pthread 사용시 주의할점과 tread detach, join에 관해

pthread를 사용하는 멀티스레드 프로그램에서 여러가지 테스트 중 메모리 누수가 발생했다. 분석 결과 매번 어떤 기능을 할 때 pthread_create를 통해 생성 된 새로운 thread가 작업을 처리하고 thread가 끝나는 구조인데pthread_create 후 메모리를 회수 하지 않아서 문제가 되었다. 예제처럼 pthread를 사용하면 memory leak발생가능 12345678910111213141516171819202122232425262728293031323334353637383940#include#include#include #include void *thread_test(void * data){ char * str = (char*)malloc(sizeof(1024)); printf("Th..

자유로운 범고래
'리눅스' 카테고리의 글 목록