2014-01-17 4 views
0

소켓에서 들어오는 연결을 수신하고 클라이언트를 수락 한 부모 프로세스가 있고 관련 파일 디스크립터와 다른 날짜를 전달합니다 (이름 붙이기 파이프).포크 후 부모 파일에서 자식 파일 작성

이 순간부터 하위 프로세스는 클라이언트에게 서비스를 제공하고 부모는 새 클라이언트를 계속 수신합니다.

내 문제는 자식 프로세스에서 파일 설명자를 쓸 때 잘못된 파일 기술자 오류가 발생하고 쓰기에 실패한다는 것입니다. 내 생각 엔이 파일 설명자가 포크 후에 만들어지기 때문에 자식은 단순히 그들을 사용할 수없고 부모 프로세스에만 속하는 것입니다.

그래서 이것이 쓰기 오류의 원인입니까? 자녀가이 파일 설명자를 사용할 수있는 방법이 있습니까?


가 loreb하여 대답에 언급 된 바와 같이 해결
,이 방법으로, 원하는 결과를 달성 할 수 없다. 다른 파이프를 사용하여 아이의 응답을 부모에게 전달함으로써 임시 수정을 수행했습니다. 파일 디스크립터는 부모에 속하므로 소켓을 통해 응답을 클라이언트에 전달할 수있다.

+0

왜 부모 프로세스에서 소켓을 생성하지 않으므로 파일 설명자가 부모와 자식간에 공유됩니다. –

+0

@Abhiteshkhatri fork가 수행 된 후 클라이언트가 계속 연결되고 fork 후 생성 된 파일 설명자가 공유되지 않기 때문에 부모와 자식. – mdoust

+0

당신은 fork 전에 공유 메모리를 생성하고 공유 메모리에 파일 디스크립터를 보관할 수 있습니다. (파일 디스크립터를 공유 메모리에 두는 방법에 대해서는 의문이 있습니다.) 그렇다면 당신의 기술자는 자식과 부모간에 공유 될 것입니다. –

답변

0

파일 설명자를 전달하려면 명명 된 파이프가 아닌 AF_UNIX AF_UNIX가 필요합니다. sendmsg (3)이 필요합니다. 사용하기에 별 다른 생각이 들지 않으므로 웹에서 예제를 찾아 보는 것이 좋습니다. 예 : libowfat의 io_passfd.

편집 : 경우에 사람이 (2)

+0

답변 해 주셔서 감사합니다. 그래서 귀하의 대답을 기반으로, 파일 설명자를 전달하는 것은 단순히 정수 값을 자식으로 전달하는 것만 큼 간단하지 않습니다. 이 과제를 위해 나는 sendmsg() 시스템 호출을 사용할 수 없다. 나는 여기서 재 설계해야 할 것 같아. 다시 한번 감사드립니다. – mdoust

+0

그래, 그렇게 간단하지 않아. 세부 정보에 관심이 있다면 오른쪽의 "관련"섹션에 몇 가지 좋은 설명이 있습니다. – loreb

0

어쩌면 당신은 폐쇄를 시도하고 그 FD의 재개해야 socketpair의를 사용 AF_UNIX 클라이언트/서버를 사용하지 않는,이 답변에 실수를 한단다.

+0

파일 설명자가 활성 소켓 연결에 속해 있으므로 부모 노드를 닫은 다음 하위 노드에서 다시 여는 것만 큼 간단하지 않습니다. – mdoust

관련 문제