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_..

    ptrace - process tracer (writing....)

    ptrace (process trace) ptrace에 대해서 간단히 알아보겠습니다.ptrace() system call은 어느 프로세스(tracer)가 다른 프로세스(tracee)의 실행을 추적 및 제어할 수 있는 기능을 제공합니다. tracer는 tracee의 메모리, 레지스터, 코드, 데이터, 스택, 힙 등의 정보를 확인할 수 있으며 변경도 할 수 있는 기능을 제공하며, 여러분들이 gdb 와 같은 디버거에서 많이 사용하는 중단점을 이용한 디버깅이 가능합니다. 또한 system call 추적 등의 기능을 구현할 때 자주 사용되죠. 리눅스나 유닉스 같은 운영체제에서 ptrace를 이용하여 ELF를 분석, 디버깅 등을 가능케 해주는 좋은 녀석입니다. ptrace를 사용해 프로세스의 실행 흐름을 제어할 수..

    Elf Header, Program Header, Section Header 얻어오기

    #include #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]){int ret;int fd;int i;uint8_t *mem;struct stat st; Elf32_Ehdr *ehdr = NULL;Elf32_Phdr *phdr = NULL;Elf32_Shdr *shdr = NULL; if (argc < 2) {printf("Usage: %s \n", argv[0]);exit(0);} errno = 0;fd = open(argv[1], O_RDONLY);if (errno < 0 || fd == -1) {perror("open");exit(-1);} er..

    [socket] socketpair non-blocking read write

    #include #include #include #include #define RCV_SOCK 0#define SND_SOCK 1 #define MAX_RETRY_CNT 5#define WRITE_TIMEOUT 20 /* milliseconds*/ static int read_buf_size = -1;static int write_buf_size = -1; static int __get_socket_buffer_size(int fd, int optname){int err;int size;socklen_t len = sizeof(int); errno = 0;err = getsockopt(fd, SOL_SOCKET, optname, (void *)&size, &len);if (err != 0) {printf..

});