나는 일반 파일보다 소켓에 더 관심이 있지만 기본적으로 한 프로세스가 소켓을 차단으로 "볼" 수 있고 다른 프로세스가 이를 비차단으로 볼 수 있는지 알고 싶습니다. 내 생각에는 그렇습니다. 커널은 시스템 호출에 사용된 옵션을 기반으로 이 모든 것을 처리합니다.
나는 이것이 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_DONTWAIT
read(2)
write(2)
답변2
프로세스에서 하나의 파일 설명자를 차단 또는 비차단으로 변경해도 동일한 프로세스나 다른 프로세스의 다른 파일 설명자에는 영향을 미치지 않습니다. O_NONBLOCK은 파일이나 소켓이 아닌 파일 설명자의 속성입니다. 제가 기억을 잘못했어요. 이를 방지하려면 파일을 두 번(dup/fork 대신) 열거나 소켓을 두 번 만들어야 합니다.
그리고 서로 다른 프로세스가 동일한 TCP 소켓을 사용할 수 있습니다. 바라보다이 문제. 올바르게 동기화되면 동일한 소켓에 쓸 수도 있습니다.