2012-08-16 4 views
1

select()를 사용하여 연결할 준비가 된 소켓을 폴링하는 프로그램이 있습니다.select() 문과 관련된 문제

소켓에 바인딩하고 send() 명령을 실행하는 다른 프로그램이 있습니다.

파일 디스크립터가 두 개의 실행 파일을 통해 작동하는 경우 내가 가진 질문이 있습니다.

즉, 프로그램 A의 파일 설명자 5를 FD_SET에 추가하고 프로그램 B의 소켓 fd를 5로 설정하면 해당 소켓의 send()가 프로그램 A를 깨우고 해당 프로그램에서 5를 포함하는 FD_SET?

감사합니다.

답변

0

파일 설명자 번호와 아무 관련이 없습니다.

다른 쪽 끝이 읽기 용으로 선택된 소켓 인 소켓을 통해 보낼 경우 선택기는 읽기 이벤트를 감지합니다.

+0

아 - 그래. select 문이 뒤 따르는 디스크립터 세트는 모든 프로세스에서 정적이라는 인상을 받고있었습니다. 나는 만들어지는 소켓이 양면에서 똑같은지 두 번 확인합니다. – Derek

+0

@Derek 그 인상은 심지어 말이되지 않습니다. FD는 프로세스에 로컬입니다. – EJP

2

아니요, 파일 설명자 번호는 프로세스에 따라 다릅니다. 서로 다른 프로세스간에 동일한 fd 번호를 사용하면 암시 적 효과가 없습니다.

0

대부분 1024 디스크립터 (파일/소켓)가 주어진 프로세스 (0-1023)에 의해 지원되었습니다 (/ proc/limits의 프로세스가 지원하는 파일/소켓 디스크립터의 최대 제한 참조).

첫 번째 3 개의 설명자 (0, 1 및 2)가 각각 stdin, stdout 및 stderr에 할당되었습니다. 값이 3 인 다음 디스크립터는 다음 열려있는 파일/소켓 디스크립터에 할당되고/proc에 지정된 한계까지 갈 수 있습니다. 참고 : 지원되는 최대 설명자를 변경할 수도 있습니다.

/proc/fd에서 주어진 프로세스에 의해 열리는 파일 설명자 목록을 볼 수 있습니다. 각 프로세스 설명자/신호/이벤트 범위는 프로세스에만 적용됩니다.

+0

감사합니다 - 내 다음 질문은 프로세스 ID가 프로세스를 열어 놓은 것을 확인하는 방법이었습니다. processA가 무의식적으로 소켓 준비를 듣고 있다는 문제가있는 것 같습니다. – Derek

+0

디버깅을 쉽게하기 위해 '/ proc/fd'를 수동으로 실행하는 것 외에'lsof'를 시도해 볼 수도 있습니다. –

관련 문제