Blog

Real Estate and Mortgage Blog

리눅스 select 예제

시스템 호출 `선택`으로 당신은 한 번에 여러 연결을 처리 할 수 없습니다. 이렇게 하려면 스레드 또는 프로세스를 사용해야 합니다. 클라이언트 요청을 처리하는 데 시간이 오래 걸린다고 가정해 보겠습니다. `select`를 사용하면 첫 번째 클라이언트 요청이 완료될 때까지 다른 클라이언트 요청에 참석할 수 없습니다 pselect()가 필요한 이유는 신호 또는 파일 설명자가 준비되기를 기다리려면 원자성 테스트가 필요하다는 것입니다. 경주 조건을 방지하기 위해 에드. (신호 처리기가 전역 플래그를 설정하고 반환한다고 가정합니다. 그런 다음 이 전역 플래그의 테스트 다음에 select() 호출이 호출된 후 테스트 직후에 신호가 도착한 경우 무한정 중단될 수 있습니다. 반대로 pselect()는 신호를 먼저 차단하고 들어온 신호를 처리한 다음 원하는 시그마스크로 pselect()를 호출하여 경주를 피할 수 있습니다.) 선택 함수는 활동이 발생할 때까지 차단합니다. 예를 들어 소켓을 읽을 준비가 되면 select가 반환되고 readfs에는 읽을 준비가 된 소켓이 있습니다. int pselect(int nfds, fd_set *readfds, fd_set *쓰기, fd_set *exceptfds, const struct 시간 사양 *시간 시간, const sigset_t *sigmask); 성공시 select() 및 pselect()는 반환된 세 개의 설명자 세트에 포함된 파일 설명자 수(즉, readfds, writefds, 제외)에 포함된 파일 설명자 수를 반환하며, 시간 지정이 만료되는 경우 0일 수 있습니다. 흥미로운 일이 일어난다.

오류가 발생하면 -1이 반환되고 errno가 적절하게 설정됩니다. 세트와 시간 설정이 정의되지 않으므로 오류 후 내용에 의존하지 마십시오. int select(int nfds, fd_set *readfds, fd_set *쓰기, fd_set *제외fds, 구조적 시간 *시간 시간 설정); void FD_CLR(int fd, fd_set *세트); int FD_ISSET(int fd, fd_set *세트); 보이드 FD_SET(int fd, fd_set *세트); 보이드 FD_ZERO(fd_set *세트); (그러나 POSIX.1-2001 버전에서 아래를 참조하십시오.) 일부 코드는 세 세트모두 비어 있고, n0 및 NULL이 아닌 시간 아웃을 subsecond 정밀도로 절전 모드로 사용할 수 있는 방법으로 select()를 호출합니다. 이 자습서에서는 select 메서드 접근 방식을 사용합니다. 선택 기능을 사용하면 프로그램이 특정 “활동”이 발생하도록 여러 소켓을 모니터링할 수 있습니다. 예를 들어 선택된 소켓 중 하나에서 읽을 데이터가 있는 경우 해당 정보를 제공합니다. /* 들어오는 클라이언트 연결. 이 예제에서 */pselect()는 POSIX.1g 및 POSIX.1-2001에서 정의됩니다. Linux에서 select() 는 잠들지 않는 시간을 반영하도록 시간 시간을 수정합니다. 대부분의 다른 구현은 이 작업을 수행하지 않습니다.

(POSIX.1-2001은 어느 한 쪽의 행동을 허용합니다.) 이렇게 하면 시간 지정을 읽는 Linux 코드가 다른 운영 체제로 이식되고 코드가 Linux로 이식되어 루프에서 여러 select()에 대한 구조형 시간 벌을 다시 사용하는 경우 문제가 발생합니다. () 반환 후 시간 시간을 정의하지 않는 것으로 간주합니다. 당신의 인수는 정확히 무엇입니까? 이 자습서에서는 select 함수를 사용하여 여러 클라이언트를 처리하는 것을 담당하며 올바른 기능을 사용합니다. 마스터 세트가 있는 이유는 select() 실제로 전달할 집합을 변경하여 읽을 준비가 된 소켓을 반영하기 때문입니다.