μμΌ λ©ν°νλ μ± ν¨μ select()
μλ²κ° μ¬λ¬ ν΄λΌμ΄μΈνΈλ₯Ό μ²λ¦¬νκΈ° μν λ°©λ² μ€ μ
μΆλ ₯ λ€μ€νλ₯Ό μ¬μ©νλ λ°©λ²
μ
μΆλ ₯ λ€μ€νλ μ¬λ¬ μ
μΆλ ₯ λμμ΄ μμ λ κ·Έ λμλ€μ κ²μ¬νλ©° μ
μΆλ ₯μ΄ νμν λλ§λ€ μμ
μ μννλ κ²μ λ§νλ€. μ΄ λ°©λ²μ λ©ν° νλ‘μΈμ±, λ©ν° μ€λ λ© λ°©λ²κ³Ό λ€λ₯΄κ² μ±κΈ νλ‘μΈμ€, μ±κΈ μ€λ λμμλ λμ
μμ ν λμμ μ²λ¦¬νμ§ λͺ»νλ λ¨μ μ΄ μλ€.
select() ν¨μ
리λ
μ€λ select() ν©μλ‘ μ
μΆλ ₯ λ€μ€νλ₯Ό ꡬνν μ μλ€. select()λ μ§μ ν λ²μμ file discripter μ€ FD_SETμΌλ‘ 1λ‘ set λμ΄ μλ νμΌμ μννλ©΄μ λ³νκ° μλ file discripterλ₯Ό λ°ν
νμΌμ λ³νκ° μλ€λ©΄ 1, μλ€λ©΄ 0 set
file discripter
- select()λ₯Ό μ΄ν΄νκΈ° μν΄μλ 리λ μ€μμ νμΌμ κ΄λ¦¬νλ λ°©λ²μ μμμΌ νλ€. 리λ μ€λ νμΌμ file discripterλ‘ κ΄λ¦¬νλ©°, 리λ μ€ μμ€ν μμ νμΌμ μ΄λ©΄ ν΄λΉ νμΌμ λν μ 보λ₯Ό λ΄μ ꡬ쑰체λ₯Ό κ°λ¦¬ν€λ ν¬μΈν°λ€μ΄ table ννλ‘ μ μ₯λλλ° μ΄ tableμ μμΈ λ²νΈκ° λ°λ‘ file discripterλ€.
- 리λ μ€λ μμΌλ νμΌλ‘ λ€λ£¨κΈ° λλ¬Έμ νΈλ¦¬νκ² μ¬μ©ν μ μλ€.
- 리λ μ€μμ 0, 1, 2λ² νμΌμ κΈ°λ³Έμ€μ μΌλ‘ μ§μ λμ΄μμΌλ©° μμμ νμΌλ€μ 3λΆν° fdλ₯Ό λΆμ¬λ°λλ€. μμΌλ νμΌλ‘ λ€λ£¨κΈ° λλ¬Έμ μμΌμ μμ±νλ©΄ 3 μ΄μμ fd(file discripter)λ₯Ό λΆμ¬ λ°λλ€.
fd set
- ν¬κΈ°κ° 1024μΈ λΉνΈνλ μ΄λ©° 0κ³Ό 1μ κ°μ κ°μ§λ€.
int select(int n, // κ²μ¬ν νμΌ λμ€ν¬λ¦½ν° λ²νΈ μ€ κ°μ₯ ν° κ°+1 (λ°°μ΄μΈμλ‘ μ κ·ΌνκΈ° λλ¬Έμ)
fd_set* readfds, // μ½κΈ°λ₯Ό κ²μ¬ν fd_set
fd_set* writefds, // μ°κΈ°λ₯Ό κ²μ¬ν fd_set
fd_set* exceptfds, // μμΈλ₯Ό κ²μ¬ν fd_set
const struct timeval* timeout); // κ²μ¬νλ μκ°μ μ νμ λλ€. NULLμ΄λ©΄ 무νμ λκΈ°νλ€.
// returnκ° : 0 <= λ³κ²½μ΄ μκΈ΄ νμΌμ μ, -1 = μ€ν¨
select()μ ν΅μ¬μ fd_setμ μ μ΄νλ κ²μ΄λ€. fd_setμ νμΌ λμ€ν¬λ¦½ν° λ²νΈλ₯Ό λ°°μ΄λ‘ κ°μ§λ 'λΉνΈ νλ'ꡬ쑰체μ΄λ€. select()λ fd_setμ μννλ©°, fd_setκ°μ΄ 1μΈ νμΌμ λν΄ μ½κΈ° λλ μ°κΈ°λ₯Ό κ²μ¬νκ³ λ³νκ° μκΈ΄ fd_setμ 1λ‘ νλ€. ( μλ€λ©΄ λΉμ°ν 0μΌλ‘ νλ€. )
fd_setμ μ μ΄νλ λ§€ν¬λ‘ ν¨μλ λ€μκ³Ό κ°λ€.
ν¨μ | μ€λͺ |
---|---|
FD_ZERO(*fds) | fd_setμ μ΄κΈ°ννλ€. λͺ¨λ κ°μ 0μΌλ‘ νλ€. |
FD_SET(fdnum, *fds) | fdnum(νμΌ λ²νΈ)μ fd_setμμ 1λ‘ νλ€. select()λ μ΄ νμΌμ κ²μ¬νλ€. |
FD_ISSET(fdnum, *fds) | fdnumμ΄ fd_setμμ 1μΈμ§ κ²μ¬νλ€. |
FD_CLR(fdnum, *fds)) | fd_setμμ fdnumμ μ κ±°νλ€. λμ΄μ κ΄λ¦¬ν νμκ° μμ λ μ¬μ©νλ€. |
μ΄μ select()λ‘ μμΌλ€μ μ
μΆλ ₯μ κ΄λ¦¬νλ λ°©λ²μ μμ보μ.
λ¨Όμ 7κ°μ μμΌμ λ§λ€μκ³ , κ° μμΌμ 3~9κΉμ§ fdnumμ λΆμ¬λ°μλ€κ³ κ°μ νμ. κ·ΈλΌ fd_setμ λͺ¨μ΅μ λ€μκ³Ό κ°μ κ²μ΄λ€.
fd_set* readfds
fdnum | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
bit | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
μ΄μ 3,5,8 μμΌμ λν΄ μ½κΈ°λ₯Ό κ²μ¬νκΈ° μν΄ 3, 5, 8λ²μ λ±λ‘νλ€.
FD_SET(3, &readfds);
FD_SET(5, &readfds);
FD_SET(8, &readfds);
fd_set* readfds
fdnum | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
bit | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
select()λ‘ fd_setμ κ²μ¬νλ€.
nfdsκ° 9μΈ μ΄μ λ κ²μ¬ν λΉνΈκ° λ°°μ΄ λ²νΈμ 9λ²λΉνΈ κΉμ§μ΄κΈ° λλ¬Έμ΄λ€.
select(9, &readfds, (fd_set_)0, (fd_set_)0, NULL);
μλ₯Όλ€μ΄ 3λ²κ³Ό 5λ²μμ λ³νκ° μκ²Όλ€λ©΄ fd_setμ λͺ¨μ΅μ λ€μμ²λΌ λ³νλ€
fd_set* readfds
fdnum | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
bit | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
- fd_setμ μ΄μ μνλ₯Ό μ μ§νμ§ μμΌλ―λ‘ λ€μ λ 3, 5, 8λ² μμΌμ κ²μ¬νκ³ μΆλ€λ©΄ λ€μ FD_SETμΌλ‘ λ±λ‘μν€κ³ μ¬μ©ν΄μΌ νλ€.
selectλ‘ λͺ¨λ μμΌ μ€μ λκ° λ³νκ° μλ μμΌμ΄ μλμ§ μμλμΌλ μ΄μ FD_ISSETμΌλ‘ μ΄λ€ μμΌμ λ³νκ° μλμ§ κ²μ¬λ₯Ό ν μ μλ€
FD_SET(int fd, fd_set* fdset) // fdsetμ fdλ²μ§Έ μΈμλ₯Ό 1λ‘ set (fdλ² μμΌμ 1λ‘ μ¬λ¦°λ€λ μ리)
FD_ISSET(int fd, fd_set* fdset) // fdsetμ fdλ²μ§Έ μΈμ κ°μ return
μ μμμ 3λ²κ³Ό 5λ² μμΌμ λ³νκ° μμμΌλ
read_fdsμ fd_arryaλ [0][0][0][1][0][1][0] ...
FD_ISSET(3, &read_fds) μ FD_ISSET(5, &read_fds)μ κ°μ 1μ΄ λ κ²μ΄κ³
λ°λ³΅λ¬Έμ λλ©΄μ μμΌ 0λ²λΆν° μ΅λ μμΌλ²νΈ n κΉμ§ μννλ©° read_fdsλ₯Ό κ²μ¬νλ©΄ μ΄λ€ μμΌμ΄ λ°μ΄ν°λ₯Ό μμ λ°μλμ§ μ μ μλ€.