일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- chromeSetup.exe 안됨
- 연산자 끼워넣기
- C++
- 백준 14888번
- 바로꺼짐
- 크롬 설치 안됨
- ChromeStandaloneSetup64안됨
- 로봇청소기
- chromeSetup.exe꺼짐
- 크롬설치파일꺼짐
- 크롬설치
- 삼성 sw 역량테스트
- 백준 14503번
- Today
- Total
공대생의 개발 일기장
System Programming - Select 본문
socket이 정말 어려웠는데 네트워크 환경에서 서로 연결이 됐다 안됐다해서 정말 어려웠다. 근데 생각해보니 보통 서버 - 클라이언트 관계라고 하면 1 : n의 관계아닌가? 그래서 이번에는 그렇게 여러 개의 클라이언트를 연결하는 Select 함수를 생각해보자. 사실 자식 프로세스를 만드는 fork로 해도 뭔가 될 것 같은데... 찾아보니 실제로 fork와 select를 둘 다 쓴다고 한다.
fork는 서로 통신하지 않는 약간 일방적인 단방향적인 서버인 경우에는 fork가 좋고, 그럼 당연히 반대로 select는 양방향적인 서버의 경우에는 select가 좋다. 각각의 단점은 찾아보면 그냥 혹시나 코드를 찾아본다면 알겠지만 그냥 fork는 프로그래밍이 쉽고 select는 어렵다.
select는 bit vector라는 것을 사용한다. bit vector... 이름 그대로다. bit으로 이루어진 동적 배열..의 느낌이 팍 오지 않는가? 비슷하다.이에 대한 함수도 있는데fd_set 이름 // 딱봐도 bit vector 선언. 여기서 1024bit의 크기를 가진다. 2^10 = 1024인데 왜 그런지는 모르겠다.FD_ZERO(&이름) // 함수 이름대로 0으로 모두 초기화FD_SET(bit자리, &이름) // bit vector의 특정 bit자리를 1로FD_CLR(bit자리, &이름) // 특정자리를 clear = 0으로!FD_ISSET(bit자리, &이름) // 그 자리가 1인가요? 맞으면 true 아니면 false
참고로 #include <sys/select.h> 헤더파일은 이거다. 더 찾아보면 뭐가 있긴한데 이 함수들이 일단 기본적으로 걍 직관적으로 쉽다. 요것만 일단 사용해보고 더 필요하거나 써야하는게 있으면 추가하겠다.
아까 select는 양방향적으로 소통이 좋다고 했는데 select는 multiple socket을 선택할 수 있다. 그냥 동시에 소켓을 여러개 선택할 수 있다. 그렇기 때문에 좀 더 소통이 좋은 거라고 보면 될 것 같다.
근데 만약에 select가 2, 4, 6, 8의 소켓을 지정하고 클라이언트가 보내는 패킷을 기다린다고 쳐보자. 프로그래밍에서 무언가가 왔음에 대한 신호는 거진 대부분 1이니까 bit vector에서 소켓이 1이 됐다는건 클라이언트로부터 무슨 신호가 왔다는 것! 그럼 0은 뭘까. 걍 클라이언트가 아무것도 안했다는거다.여기서 착각하면 안되는게 0도 패킷의 값으로 날라오는 것! 아직 안했기 때문에 0인 상태인게 아니라 아무것도 안했다에 대한 0의 값이 날라오는 것이다!! 즉, 2, 4, 6, 8의 해당하는 값이 1 1 1 0이라고 하면 아직 select함수가 안끝난게 아니라 끝났다. 그 이후의 과정은 1로 들어온 bit vector 자리 소켓에 대한 과정만 있으면 된다.
'시스템 프로그래밍 - 리눅스' 카테고리의 다른 글
System Programming - network2 (0) | 2023.05.16 |
---|---|
System Programming - network (0) | 2023.05.09 |
System Programming - pstree, environment variable (0) | 2023.05.02 |
System Programming - gdb for fork (0) | 2023.05.02 |
System Programming - exit, wait, shell (0) | 2023.05.02 |