2009-07-14 2 views
0

우분투에서이 테스트 어플리케이션을 사용할 때 recvmsg() 블록이 왜 발생하는지 알 수 없습니다.유닉스 도메인 소켓을 사용하고 fd를 공유 함

http://web.mit.edu/kolya/misc/break-chroot.c

감사

+2

fd를 */dev/null *에 전달하는 부모와 자식을 재현하기 위해 예제를 최소로 줄이면 안 될까요? (덧붙여 말하자면, 전에 NULL * msg_iov *로 전달되는 fd를 보지 못했습니다. 아마도 보조 데이터와 함께 바이트를 보낼 수 있습니까?) – pilcrow

답변

2

난 강력 유닉스 데이터 그램 소켓이 아닌 유닉스 스트림 소켓을 통해 작업만을 통과하는 파일 기술자를 기억한다. 이것은 재전송을 필요로 할 수도 있습니다. 귀하의 예가 너무 커서 (나는 너무 게을러서) 적절한 분석을 할 수는 없지만 대신 예제 코드는 here입니다. 필자는이 예제를 FreeBSD와 Linux 모두에서 사용했습니다.

+0

감사합니다. 참조한 코드가 내 환경에서도 정상적으로 작동합니다. 그러나 문제는 내가 msg.msg_iovlen = 0 및 msg.msg_iov = NULL로 설정했을 때 우분투에서 작동하지 않는다는 것입니다 (리눅스/유닉스의 다른 맛의 동작에 대해서는 확신하지 못합니다). recvmsg()가 반환되지 않고 msg를 기다리는 동안 차단됩니다. 내 게시물에서 언급 한 예제는 msg.msg_iov = NULL로 설정합니다. – harishvk27

+0

예제 코드는 메시지를 전달하기 위해 적어도 1 바이트의 '실제'데이터를 보내야한다고 설명합니다. –

+0

'SOCK_STREAM' 유닉스 소켓도 제 자신의 경험에 따라 작동하고, 아마도 더 믿을만하게 :), Stevens의 * UNIX Network Programming *. – pilcrow

관련 문제