기본 콘텐츠로 건너뛰기

[C언어] epoll API

 프로그래머 입장에서는 단지 3개정도의 관련 함수만 알면 어렵지 않게 epoll응용 어플의 제작이 가능하다.

4.3.1 epoll_create(2)
epoll_create(int size);
epoll_create()는 이벤트를 저장하기 위한 size만큼의 공간을 커널에 요청한다. 커널에 요청한다고 해서 반드시 size만큼의 공간이 확보되는 건 아니지만 커널이 대략 어느 정도의 공간을 만들어야 할지는 정해줄 수 있다. 수행된 후 파일 지정자를 되돌려 주는데, 이 후 모든 관련작업은 리턴된 파일 지정자를 통해서 이루어지게 된다. 모든 작업이 끝났다면 close()를 호출해서 닫아주어야 한다.
 
4.3.2 epoll_wait(2)
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); 
실제 이벤트가 발생하는걸 기다리고 있다가, 이벤트가 발생하면 이벤트 관련 정보를 넘겨주는 일을 한다. 
epfd는 epoll_create(2)를 이용해서 생성된 epoll지정자이다. 만약 이벤트가 발생하면 리턴하게 되는데,
리턴된 이벤트에 관한 정보는 events에 저장된다. maxevents는 epoll이벤트 풀의 크기다.
timeout는 기다리는 시간이다. 0보다 작다면 이벤트가 발생할 때까지 기다리고, 0이면 바로 리턴,
0보다 크면 timeout 밀리세컨드 만큼 기다린다. 만약 timeout시간에 이벤트가 발생하지 않는다면
0을 리턴한다. 이벤트가 발생했다면 발생한 이벤트의 갯수를 리턴한다. 
4.3.3 epoll_ctl(2)
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 
이벤트풀을 제어하기 위해서 사용한다. poll(2)와 매우 비슷하게 작동한다.
op는 fd에 대해서 어떤 작업을 할것인지를 정의하기 위해서 사용된다.
op가 실행된 결과는 event구조체에 적용된다. 
다음은 epoll_event구조체의 모습이다.
 
typedef union epoll_data {
     void *ptr;
     int fd;
     __uint32_t u32;
     __uint64_t u64;
} epoll_data_t;

struct epoll_event {
     __uint32_t events;  /* 발생된 이벤트 */ 
     epoll_data_t data;  /* 유저 데이터로 직접 설정가능하다 */  }; 
epoll_data_t를 유심히 볼필요가 있다. 이것은 유저 데이터가 직접 설정이 가능한데, 여기에서 설정한 값은 epoll_wait를 통해서 넘어오는 epoll_event구조체값으로 그대로 사용할 수 있다. 예를들어 여기에 pid값이라든지 소켓지정번호등을 지정해 놓게되면 나중에 이벤트가 발생했을 때 이벤트가 발생한 파일등에 대한 정보를 쉽게 얻어올 수 잇다. 
op는 다음과 같은 종류의 작업명령들을 가지고 있다. poll(2)와 비교해보면 매우 유사함을 알 수 있을 것이다. 
  • EPOLL_CTL_ADD
    fd를 epoll 이벤트 풀에 추가하기위해서 사용한다. 
  • EPOLL_CTL_DEL
    fd를 epoll 이벤트 풀에서 제거하기 위해서 사용한다.
  • EPOLL_CTL_MOD
    이미 이벤트 풀에 들어 있는 fd에 대해서 event의 멤버값을 변경하기 위해서 사용한다.
  • EPOLLIN
    입력(read)이벤트에 대해서 검사한다. 
  • EPOLLOUT
    출력(write)이벤트에 대해서 검사한다.
  • EPOLLERR
    파일지정자에 에러가 발생했는지를 검사한다. 
  • EPOLLHUP
    Hang up이 발생했는지 검사한다.
  • EPOLLPRI
    파일지정자에 중요한 데이터가 발생했는지 검사한다.
  • EPOLLET
    파일지정자에 대해서 Edge 트리거 행동을 설정한다. Level 트리거가 기본설정 된다. 

댓글

이 블로그의 인기 게시물

UNIX C errno 정리( 에러 번호 )

#define EPERM   1   /* Operation not permitted      */ #define ENOENT  2   /* No such file or directory        */ #define ESRCH   3   /* No such process          */ #define EINTR   4   /* interrupted system call      */ #define EIO 5   /* I/O error                */ #define ENXIO   6   /* No such device or address        */ #define E2BIG   7   /* Arg list too long            */ #define ENOEXEC 8   /* Exec format error            */ #define EBADF   9   /* Bad file descriptor   ...

시리얼(Serial) 이란?

출처 - http://www.ni.com/white-paper/2895/ko/#toc4 시리얼은 거의 모든 PC에서 표준으로 사용되는 디바이스 통신 프로토콜입니다. 시리얼의 개념을 USB의 개념과 잘 구분하십시오. 대부분의 컴퓨터에는 2개의 RS232 기반 시리얼 포트가 있습니다. 시리얼은 또한 여러가지 디바이스에서 계측을 위한 일반 통신 프로토콜이며, 여러 GPIB 호환 디바이스에는 RS232 포트가 장착되어 있습니다. 뿐만 아니라, 원격 샘플링 디바이스로 데이터 수집을 하는 경우에도 시리얼 통신을 사용할 수 있습니다. 시리얼 통신의 개념은 간단합니다. 시리얼 포트는 정보의 바이트를 한번에 한 비트씩 순차적으로 송수신합니다. 한번에 전체 바이트를 동시에 전달하는 병렬 통신과 비교하면 시리얼 통신은 속도가 느리지만 훨씬 간단하며 장거리에도 사용할 수 있습니다. 예를 들어, 병렬 통신용 IEEE 488 스펙을 보면 기기간 케이블링은 총 20 m 미만이어야 하며, 두 개의 디바이스간은 2 m 미만이어야 합니다. 반면 시리얼 통신은 최대 1.2 Km의 통신거리를 보장합니다. 통상 엔지니어들은 ASCII 데이터를 전송할 때 시리얼 통신을 사용합니다. 이 때 송신용 (Tx), 수신용 (Rx), 그라운드용 (GND)의 세 가지의 전송 라인을 사용하여 통신합니다. 시리얼은 비동기식이므로 포트는 한 라인에서 데이터를 전송하고 다른 라인에서 데이터를 수신합니다. 핸드쉐이킹용 라인도 사용 가능하지만 필수 요구사항은 아닙니다. 시리얼 통신의 가장 중요한 특징에는 보드 속도 (baud rate), 데이터 비트, 정지 비트, 패리티가 있습니다. 두 개의 포트가 통신하기 위해서는 이러한 파라미터가 반드시 적절하게 맞춰져야 합니다. 보드 속도는 통신의 속도를 측정하는 수치이며 초당 비트 전송 숫자로 표시됩니다. 예를 들어 300 보드 속도는 초당 300 비트를 의미합니다. 엔지니어들이 흔히 말하는 클럭 주기는 보드 속도를 의미합니다. 따라서 프로토콜에 ...

기본적인 Mutex 초기화 방법들

출처 :  http://hkpco.egloos.com/898623 유닉스 시스템 계열에서 제공되는 pthread에서 동기화를 위하여 mutex라는 것이 자주 사용되는데, mutex 변수 초기화 시에 사용되는 방법이 대표적으로 두 가지 정도가 있습니다. (원래는 더 많지만 "가장" 기본적인 초기화를 기준으로) 그 중 하나가 바로 PTHREAD_MUTEX_INITIALIZER 이며, 해당 mutex를 default 속성으로 초기화 시켜줍니다. pthread.h 헤더에 다음과 같이 정의되어 있습니다. ============================================================== #define PTHREAD_MUTEX_INITIALIZER \   {0, 0, 0, PTHREAD_MUTEX_TIMED_NP, __LOCK_INITIALIZER} ============================================================== 사용법은 다음과 같습니다. ---------------------------------------------------------------------- pthread_mutex_t mutx = PTHREAD_MUTEX_INITIALIZER; int main( void ) {         return 0; } ---------------------------------------------------------------------- PTHREAD_MUTEX_INITIALIZER 사용시 주의할 점은 pthread_mutex_t type이 구조체 형태로 이루어져 있기 때문에 변수 선언 이후에는 사용할 수 없으며(다시말해, 선언과 동시에만 사용이 가능함), static mutex 전용이라는 것입니다. 즉, dynamic mutex 에서는 다른 방법을 사용해야 하는데, 이전에 말한 mutex 변...