사람처럼) (선택 사용하여 나에게 몇 가지 코드를 보여 그래서 난 완전히 이성을 잃었을 : 그러니까 기본적으로 소켓 파일을 삽입 바인드 후 무엇을 FD_ZERO
어떤 이유로 명확 이전 내용입니다 듣고 말하는소켓 파일 설명
FD_ZERO(&readfds);
FD_SET(socket,&readfds);
FD_SET(0,&readfds);
.......// bind() and listen(),regular stuff
// Before select(),this guy cleared readfds to null and sort of start all over again
FD_ZERO(&readfds);// Behold,this is exactly the line confusing myself
FD_SET(socket,&readfds);
// select will be called in the future within a infinite loop
fd가 다시 설정됩니다. 반면에 fd가 설정되면 0 설명자 (표준 입력)가 사라졌습니다.
누구든지이 모든 것을 설명 할 수 있습니까? 나는 이것이 정확하다고 느끼지 않지만 실제로는 그것을 이해할 수 없다. 어쩌면 몇 가지 구체적인 fd 세트를 다시 설치하는 것은 실질적인 메커니즘입니다.
bind()
및 listen()
은 fd를 몇 가지 방식으로 설정할 수 있다고 생각했습니다. 몇 가지 단절 점을 설정하고 outputs.Conunately를 검사합니다. fd 세트가 전혀 변경되지 않았습니다.
UPDATE :
정말로 나를 혼란하는 두 번째 FD_ZERO(&readfds)
입니다. 분명히 첫 번째 것은 버퍼에서 녹슨 물건을 청소하는 것과 같습니다. 매 반복마다 fdset을 기본값으로 초기화해야합니다. 나는 두 번째 것을 이해하지 못한다. 어느 것이 든 잘못된 것이거나 어쨌든 상처를 입지 않을 것입니다.
'select'는 fdset을 변경하지만'bind'와'listen'은 변경할 수 없습니다. 포인터도 주어지지 않습니다. 그러나'poll'이나'epoll'과 같은 현대적인 API를 사용하고 호의를 베풀고 fdset에 대해 다시 걱정하지 마십시오. –
시원하게 들리지만 방금 캔트가 끝납니다. – jasonkim
'poll'을 사용하십시오. 현대적이고 휴대 성이 뛰어납니다. 'epoll'은 벤치 마크 자체 쾌락만을위한 것이며 벤치 마크는 실제로 사용되는 대부분의 요구 (epoll은 실제로'poll'보다 훨씬 느립니다)와 일치하지 않습니다. –