Linux/System Programming

    shared memory with mutex

    많은 분들이 pthread의 mutex를 thread 기반 프로그래밍에서만 사용할 수 있다고 생각합니다. 공유메모리를 사용하는 멀티 프로세스 환경에서도 Lock, Unlock을 위해 pthread_mutex를 사용할 수 있습니다. 아래 코드는 master와 slave로 나눠 2개의 프로세스가 공유메모리에 대해 접근하기 위한 방법입니다. 공유메모리에 pthread_mutex_t와 int형 변수를 가진 구조체를 올려두고 각 프로세스에선 mmap으로 매핑하여 사용합니다. 이때 자원을 함께 접근하여 사용하기 위해서는 pthread_mutex_t가 2개의 프로세스가 공유해야 하는데요, 그러긴 위해선 mutex의 attribute를 PTHREAD_PROCESS_SHARED로 설정해줘야 합니다. 아래 코드 중 69,..

    [inotify] inotify로 watch 중인 파일을 vi(vim)나 gedit으로 수정 시 문제

    inotify API들을 이용해 파일이벤트들을 Watch 하는 과정에서 vi나 gedit으로 수정하면 IN_MODIFY 이벤트가 발생할 거라고 생각하시는 분들이 있습니다. vim 또는 gedit은 swap 파일을 생성하고 수정 후 파일을 대체하는 방식으로 진행하기에 vi나 gedit으로 수정 시 IN_MODIFY가 아니라 IN_IGNORED 이벤트가 발생합니다. Manual page에서 확인 시 아래와 같습니다. IN_IGNOREDWatch was removed explicitly (inotify_rm_watch(2)) or automatically (file was deleted, or filesystem was unmounted). See also BUGS. 이벤트를 확인하려는 파일이 만약 vim이나..

    [TOCTOU] Time of check to time of use 문제

    아래와 같은 코드는 TOCTOU 문제를 야기할 수 있습니다. TOCTOU 문제는 자주 발생할 수 있는 문제인데요, TOCTOU 문제가 무엇인지 어떤 상황에 발생할 수 있는 살펴보겠습니다. TOCTOU는 'Time of check to time of use' 의 약자입니다. 소프트웨어 개발 시 조건과 조건의 결과 사이에서 시스템의 변경을 이용한 Race condition이라고 할 수 있습니다. 특히 어떤 리소스를 사용하기 전에 리소스 상태를 체크하는 로직 사이에서 많이 발생할 수 있습니다. 이해가 잘 안되실 수 있으니 아래 코드를 예시로 말씀드리겠습니다. access() 호출 이후 unlink를 호출합니다. 의도는 access로 파일이 존재한다면 unlink로 파일을 제거하려는 코드인 것 같습니다. 여기서..

    [Inotify] 파일 이벤트 감시

    리눅스에서는 커널 2.6.13 부터 파일시스템 이벤트를 모니터링할 수 있는 메커니즘을 제공합니다. inotify와 dnotify인데요, 이 글에서는 inotify만 다룰 계획입니다. inotify가 dnotify를 대체하기 위한 녀석이기 때문이죠. Inotify는 파일이나 디렉토리를 개별적으로 모니터링 할 수 있도록 해줍니다. 여기서 한가지 유의할 점은 디렉토리 모니터링 시 재귀적으로 모니터링 되진 않는다는 것입니다. 만약 하위 모든 디렉토리를 모니터링 하기 위해선 각 디렉토리에 대해 모니터링을 하도록 해야합니다. 한가지 Inotify의 사용 예시를 생각해보죠. 여러분이 Daemon과 Daemon의 설정 파일을 제공한다고 가정했을 때, 누군가 설정파일을 변경 시 Daemon에서 이걸 알고 처리할 수 있도..

    shared memory with semaphore

    앞서 'shared memory with mutex' 에서는 2개 이상의 프로세스에서 공유 메모리를 이용해 데이터를 공유할 때 Lock / Unlock을 위해 mutex를 사용하는 방법에 대해 살펴보았습니다. 이번 글에서는 공유메모리를 이용해 데이터를 공유할 때 여러 프로세스들이 semaphore을 이용해 Lock / Unlock 하는 방법에 대해 알아보겠습니다. 앞서 'shared memory with mutex'를 보신 분들이라면 쉽게 이해 하실 수 있는데요, 코드 중 mutex 관련된 코드 대신 semaphore 코드로 대체해 주는 것 밖에 없습니다. 저는 semaphore을 POSIX Spinlock API들을 사용하였습니다. semaphore는 커널에서 관리해주는 정수로서 0이하의 음수 값으로는..

    [ODP] 실행시간 측정하기

    이 글은 ODP(Open Data Plane) 오픈소스 프로젝트를 이용하여 개발 시 ODP API를 이용한 내용을 다루고 있습니다. ODP 프로세스를 개발 시 프로세스 내의 실행시간 측정을 위해서는 아래와 같은 방식으로 시간 측정이 가능합니다. 리눅스 시스템 프로그래밍 시 사용하는 방법과 매우 유사하기에 빠르게 이해할 수 있을 것입니다. 1234567891011121314#include #include #include odp_time_t s_time;odp_time_t e_time;odp_time_t e_time; s_time = odp_time_global();// Do locking and unlockinge_time = odp_time_global(); d_time = odp_time_diff(e_..