2012-11-07 4 views
2

어떻게 모니터 두 파일 설명자를 알고 있지만 4 ~ 5 개의 파일 설명자를 알고 있습니까?Select() 모니터링 3 개 이상의 파일 설명자

다음은 파일 설명자 2 개를 사용하는 방법입니다.

fd_mon = (fd1 > fd2 ? fd1 : fd2) + 1; 

select(fd_mon, &readfds, NULL, NULL, NULL); 

어떻게 3 개 이상의 파일 설명자를 모니터링 할 수 있습니까?

+0

어떻게'readfds'를 설정하고 있습니까? 'readfds'를 설정하면'fd_mon'의 값을 결정해야합니다. –

+0

나는 FD_SET() 이렇게하고있다. 그래서 내가 선택할 수있는 번호를 지정할 수 있습니다 내가이 방법으로 할 수있는 3 파일 디스크립터가 .. select (3, & readfds, NULL, NULL, NULL); ? .. thanks, – demic0de

+0

select (2) 대신 poll (2)을 사용하는 것을 고려해야합니다. –

답변

0

(fd1 < fd2 ? fd1 : fd2) < fd3 ? (fd1 < fd2 ? fd1 : fd2) : fd3;

그것은 3 개 변수의를 배열 :

for(i = maxfd = 0; i < nfds; i++) { 
    if(maxfd < fd[i]) maxfd = fd[i]; 
    FD_SET(...); 
} 
select(maxfd+1, ...); 
+1

'fd_mon = fd1; if (fd2> fd_mon) fd_mon = fd2; if (fd3> fd_mon) fd_mon = fd3;은 이해하기 쉽고 (5 행 이상으로 퍼짐) 확장하기가 훨씬 쉽습니다. 다음과 같이 시작하면 100 % 일관성을 유지할 수 있습니다 :'fd_mon = -1; if (fd1> fd_mon) fd_mon = fd1; ... '. –

+0

@ demic0de - 100 개 이상의 파일 설명자를 선택해야하는 경우 가장 좋은 답변을 선택하는 것이 바람직하지 않습니까? – Joe

2

FD_SET 매크로를 사용하면 파일 설명자를 select으로 전달할 집합에 추가 할 수 있습니다. 친구가 필요합니다 FD_ZERO, FD_ISSETFD_CLR도 있습니다. 위의 경우, 각 파일 설명자와 동일한 세트에 대해 FD_SET을 계속 호출하십시오.

Google - "man select", 예를 들어 있습니다. * NIX에 얼마나 익숙한 지 모르겠지만 man (매뉴얼의 약자)은 O/S에 내장 된 도움말 시스템입니다. 시스템 호출에 대한 이러한 질문에 자주 대답합니다. 예를 들어 Ubuntu에 이 있다고 생각하지 않는 경우, 일부 배포판에 설치해야 할 수도 있습니다. 모두 개발 매뉴얼 페이지가 기본적으로 설치됩니다.

1

각 기술자 열 후 바로 테스트 할 수 : 당신은 당신이있는 기술자를 스틱 수 많은 같은 변수

0

을 위해 그것을 할 수

max_fd = 0; 

fd = open(...); 
if (fd > max_fd) { 
    max_fd = fd; 
} 
.... 
select(max_fd+1, &readfds, NULL, NULL, NULL);