2013-04-29 3 views
2

그래서 저는 select and poll 매뉴얼 페이지를 읽었습니다.하지만 불행히도, 나는 아직도 혼란 스럽습니다. 누군가가 나를 위해 다음 질문에 대답 할 수 있다면 좋을 것입니다 :select() and poll() in Linux

  • 파일이 비 차단 모드로 열렸을 때 어떻게됩니까? (O_NONBLOCK 플래그가 설정 됨)
  • 버퍼가있는 데이터가있을 때 read()가 차단하거나 무엇을 반환합니까?
  • 그리고 버퍼에 읽을 데이터가 없으면 어떻게됩니까?

답변

3

파일이 비 차단 모드로 열렸을 때 어떻게됩니까? 파일)가 (열린 차단하지 않고 에러를 반환 즉시 열리지 않을 경우

  • (O_NONBLOCK 플래그가 설정된다), 오픈()는 FIFO들로 차단할 수있다.
  • open()이 성공하면 모든 IO 작업이 비 블로킹이됩니다. 즉, IO 작업을 즉시 완료 할 수 없으면 부분적으로 수행되거나 오류 (EAGAIN 또는 EWOULDBLOCK)로 실패합니다.

데이터가 버퍼 인 경우 read()가 차단하거나 무엇을 반환합니까?

  • 판독 차단 및 비 차단 차이() 판독 할 데이터가 없을 때 일어난다. 따라서 버퍼에 데이터가있을 때 non-blocking read()가이를 반환합니다.

그리고 버퍼에 읽을 데이터가 없으면 어떻게됩니까? 데이터가없는 경우

  • ) (읽기 비 - 블로킹 (non-blocking) EAGAIN 오류로 반환합니다.
3

파일이 비 차단 모드로 열렸을 때 어떻게됩니까? (O_NONBLOCK 플래그가 설정 됨)

I/O 작업은 차단하지 않고 대신 차단되었음을 나타내는 오류 코드를 반환합니다.

데이터가 버퍼 인 경우 read()가 차단하거나 무엇을 반환합니까?

버퍼에 데이터가있는 경우 read이 반환합니다.

그리고 버퍼에 읽을 데이터가 없으면 어떻게됩니까?

소켓이 차단되면 일부 데이터가 반환 될 때까지 차단됩니다. 소켓이 비 블로킹 인 경우, 소켓이 블로킹 된 상태에서 블로킹했음을 나타내는 에러 코드를 반환합니다.

그런데 중요한 것은 selectpoll입니다. 블로킹 소켓에는 거의 사용하지 않아야합니다. select 또는 poll에서 읽기 또는 쓰기 적중 횟수를 얻으면 함수를 호출하고 반환되었을 때 차단되지 않은 상태에서 중간에 수행되는 가설적인 정식 작업을 의미합니다. 이는 상태보고 기능이며 향후 보증을 제공하지 않습니다. 차단해서는 안되는 프로그램을 작성하는 경우 모든 소켓을 비 차단으로 설정해야합니다.