한 프로세스에는 비차단 설명자가 있고 다른 프로세스에는 동일한 파일/소켓을 참조하는 차단 설명자가 있을 수 있습니까?

한 프로세스에는 비차단 설명자가 있고 다른 프로세스에는 동일한 파일/소켓을 참조하는 차단 설명자가 있을 수 있습니까?

나는 일반 파일보다 소켓에 더 관심이 있지만 기본적으로 한 프로세스가 소켓을 차단으로 "볼" 수 있고 다른 프로세스가 이를 비차단으로 볼 수 있는지 알고 싶습니다. 내 생각에는 그렇습니다. 커널은 시스템 호출에 사용된 옵션을 기반으로 이 모든 것을 처리합니다.

나는 이것이 TCP 소켓보다 Unix 도메인 소켓에 더 가깝다고 생각합니다. 왜냐하면 두 개의 다른 프로세스가 동일한 TCP 소켓을 사용할 수 있다고 생각하지 않기 때문입니다(그러나 틀릴 수도 있습니다).

답변1

당신은 잘못 추측했습니다.

이것오직속성은 파일 설명자마다 다르며 fcntl(F_SETFD)close-on-exec 플래그를 사용하여 변경할 수 있습니다.FD_CLOEXEC

다른 모든 속성은 파일별 개체(POSIX 용어로 "열린 파일 설명" - 를 사용하여 변경할 수 있음 fcntl(F_SETFL)) 또는 inode별입니다.

fcntl(F_SETFL, | O_NONBLOCK)또는 를 사용하여 비차단 플래그를 설정하면 ioctl(FIONBIO)열린 파일을 참조하는 모든 파일 설명자에 영향을 미칩니다. 읽거나 쓸 때만 파일을 비차단 상태로 만드는 방법도 없습니다.

이것은멀리이상적 - 다음을 참조할 수도 있습니다.이것StackOverflow에 대한 Q&A, 특히 lml에 대한 링크논의하다어떻게 든 그것을 고치려는 실패한 시도에 대해.

일반 파일은 본질적으로 비차단입니다. OR을 사용하면 즉시 반환 poll(2)됩니다 .select(2)

소켓에만 관심이 있는 경우 OR 대신 send(2)OR recv(2)플래그를 사용해야 합니다 . 당신이 말하는 것과는 달리, 소켓 파일 설명자는 패밀리/프로토콜/옵션에 관계없이 프로세스 간에 공유될 수 있습니다. 이는 청취 소켓에서도 작동합니다.MSG_DONTWAITread(2)write(2)

답변2

프로세스에서 하나의 파일 설명자를 차단 또는 비차단으로 변경해도 동일한 프로세스나 다른 프로세스의 다른 파일 설명자에는 영향을 미치지 않습니다. O_NONBLOCK은 파일이나 소켓이 아닌 파일 설명자의 속성입니다. 제가 기억을 잘못했어요. 이를 방지하려면 파일을 두 번(dup/fork 대신) 열거나 소켓을 두 번 만들어야 합니다.

그리고 서로 다른 프로세스가 동일한 TCP 소켓을 사용할 수 있습니다. 바라보다이 문제. 올바르게 동기화되면 동일한 소켓에 쓸 수도 있습니다.

관련 정보