2013-01-04 3 views
0

포크 작업에 익숙하지 않고 원하는 것을 달성하는 방법을 이해하는 데 어려움을 겪고 있습니다. 나는 최선을 다해 설명하려고 노력할 것이다.포킹 및 패스 소켓 C++

프로세스 A는 Linux에서 실행되는 버클리 소켓 서버입니다.

디스크에서 프로그램을 백그라운드 상태의 별도 비 차단 프로세스 (프로세스 B)로로드하려면 프로세스 A가 필요합니다. 그런 다음 프로세스 A는 프로세스 A 소켓의 프로세스 B 제어를 전달해야합니다. 마지막으로 프로세스 A는 프로세스 B를 계속 실행하면서 종료해야합니다.

이전 프로세스가 종료되면 소켓을 새 프로세스로 전달하는 데 필요한 사항과 원래 프로세스를 종료 할 수있는 비 블로킹 새 프로세스를 만드는 가장 좋은 방법이 무엇인지 명확하지 않습니다.

+0

B가 시작되기 전이나 후에 소켓을 가져 오는 중입니까? – Barmar

+0

프로세스간에 파일 핸들을 공유하는 방법이 있는지 궁금합니다. 하지만 두 가지 코드 경로 사이의 공유 데이터와 소켓 핸들에 스레드를 사용하는 두 가지 프로그램을 결합 해 보았습니까? – selbie

+0

가능한 중복 질문 : http://stackoverflow.com/questions/909064/portable-way-to-pass-file-descriptor-between-different-processes – selbie

답변

3

당신이해야 할 특별한 것은 없습니다. 프로세스 B가 상속 할 파일 설명자에 대해 close on exec 플래그가 지워져 있는지 확인하고 프로세스 B가 상속하지 않게하려는 파일 설명자를 설정하십시오. 그런 다음 exec을 호출하여 프로세스 A를 프로세스 B로 바꿉니다. 프로세스 B는 상속 가능한 모든 파일 설명자를 그대로 시작합니다.

+0

그리고 B는 사용할 파일 설명자를 어떻게 알 수 있습니까? 이 정보를 별도로 전달해야합니다. – Barmar

+0

@Barmar : 몇 가지 좋은 방법이 있습니다. 하나는 사전 동의입니다. 예를 들어 하나의 TCP 연결 만받는다면 파일 설명자 3이된다는 데 동의 할 수 있습니다.'dup2 '를 사용하여'exec'를 호출하기 전에이 파일을 배치 할 수 있습니다. (표준 in, out 및 error 작업 방법이 맞습니까?) 또 다른 방법은 B에 명령 줄 인수를 사용하는 것입니다. –

+0

저는 그것이 "당신이해야 할 특별한 무언가"라는 것을 알고 있습니다. 나는 대답을 쓸 시간이 없었고, 당신의 대답을 향상 시키려고 노력했다. – Barmar

0

상속 - 통과 포크를 사용하지 않고 열린 파일 (예 : 소켓)을 전달해야하는 경우 과 함께 ioctl을 사용합니다. Here is a very detailed description. (이를 수신 할 수있는 메커니즘이 있습니다.) 프로세스를 또는 변형을 통해 Unix 도메인 소켓과 연결하는 명명 된 파이프를 사용하여이를 수행 할 수 있습니다.