select

2019. 7. 1. 19:22임베디드/리눅스시스템프로그래밍

  1. 이벤트가 발생했을 때, 등록된 fd에 대해 하나하나 검사해야 한다. 모든 fd를 검사한다는 점에 O(n)의 시간이 걸린다. 만일 fd의 개수가 많을 때 성능은 저하될 수밖에 없다. select API의 반환값이 양수일 때, 그 수는 이벤트가 발생한 fd의 개수. FD_ISSET(int fd, fd_set *fds)으로 검사하게 된다
  2. 관리할 수 있는 fd의 개수에 제한이 있다
  3. 사용이 쉽고, 지원 OS가 많아 이식성이 좋다
  4. epoll과 많이 쓰이는 I/O Multiplexing API다

동작 방식은 다음과 같다

  1. fds에 fd 등록
  2. Application이 select를 호출하면서 blocking mode로 동작한다
  3. fd에서 지정된 이벤트가 발생했을 때 Application에게 알려준다
  4. Application에서 바로 해당 fd에 가서 이벤트에 대한 동작한다 

주의할 점은 select()를 호출 후 select()를 재호출 할 때, select()에 넘겼던 파라미터는 모두 다시 설정하셔야 정상동작한다. select() 호출이 리턴되고나면 파라미터로 넘긴 값들이 변경되기 때문에 반드시 다시 설정해야 한다.

 

기존의 inotify fd에 파일 생성과 기본적으로 있는 STDIN 파일 입출력과 관련해 select로 이벤트 검사를 하는 소스코드

https://github.com/surinoel/linux/blob/master/lsp/file_advanced/select.c

 

 

'임베디드 > 리눅스시스템프로그래밍' 카테고리의 다른 글

프로세스 생성 fork  (0) 2019.07.23
read API  (0) 2019.07.22
I/O Multiplexing  (0) 2019.07.01
pthread_func의 반환값  (0) 2019.06.13
스레드와 프로세스 fd  (0) 2019.06.11