2010-11-19 1 views
8

상황 : C로 작성된 다중 스레드 프로그램이 있습니다. 스레드 중 하나가 fork하면 exec()를 사용하여 자식 프로세스가 다른 것으로 대체되고 부모는 자식이 종료 될 때까지 기다립니다.C - exec가 멀티 스레드 프로세스에서 fork를 즉시 따라야합니까?

문제 : 자식 프로세스를 포크에 의해 생성된다 후() 인수가 다음 간부 인() 명령에 사용되는 컴파일 몇 줄의 코드가 있습니다.

가설 내가 자식 프로세스 사이의 시간에 포크 (에 의해 생성되는 가정에서 수정) 및 간부(), 자식 프로세스로 대체되고 있습니까 - 부모의 사본 인 -해야합니다 모든 쓰레드는 부모의 스레드이므로 매우 짧은 기간 동안 실행됩니다.

그렇다면 fork() 후에 exec()를 호출하는 올바른 해결책이 있습니까?

답변

9

fork을 호출하는 스레드 만 새 프로세스에서 실행됩니다. 그러나 exec 전에 함수를 호출 할 수있는 제한이 있습니다. fork :

프로세스는 단일 스레드 으로 만들어야합니다. 다중 스레드 프로세스가 fork()를 호출하면, 새로운 프로세스 는 가능성이 뮤텍스 및 기타 자원의 상태를 포함하여 호출 스레드의 복제 및 전체 주소 공간을 포함해야한다. 따라서 오류를 피하기 위해 하위 프로세스는 함수 중 하나 인 이 호출 될 때까지 비동기 신호 안전 작업을 까지만 실행할 수 있습니다. 포크 처리기 에있는 pthread_atfork() 기능에 의하여 수있다 불변을 fork() 부르는 신청을 유지하십시오.

나는이 모든 멀티 스레드 라이브러리가 제대로 pthread_atfork를 사용할 때 당신은 일반적으로 긴 괜찮을한다는 뜻 생각합니다.

편집 : pthread_atfork 페이지는 라이브러리가 자신을 보호하는 방법을 더 설명 :

예상 사용량이 핸들러가 다른 두 개의 포크 핸들러 에게 그들을 석방 모든 뮤텍스 잠금 및 을 취득 준비하는 것입니다.

예를 들어, 응용 프로그램은 필요한 라이브러리 이 유지 뮤텍스와 공급의 자녀와 부모들 뮤텍스를 해제 루틴을 취득하는 준비 루틴, 따라서 아이가의 일관된 스냅 샷을 얻을 수 있다는 보장 를 제공 할 수 있습니다 상태가 인 라이브러리 (그리고 뮤텍스는 왼쪽에 좌초 됨).또한, 일부 라이브러리는 몇 가지 알려진 값 에 라이브러리의 뮤텍스 모든 관련된 상태를 다시 초기화 단지 아이 루틴을 제공 할 수 있습니다 (예를 들어, 그것이 무엇 이미지가 원래 실행 된 경우).

+0

표준 라이브러리 (예 : stdio,'atexit','malloc', 쓰레드 생성과 파괴 등)는 내부적으로 동기화 자원을 사용할 수 있으며' 포크'? 그렇다면 어떻게'pthread_atfork'를 사용하면 문제가 해결 될까요? –

+0

@R, 가능합니다. 그것은 도서관에 달려 있습니다. 경우에 따라 모든 뮤텍스를 잠근 다음 포크 직후에 릴리스 할 수 있습니다. 다른 사람들은 프로세스가 처음부터 시작한 것처럼 다시 초기화하는 것이 좋습니다. 나는'pthread_atfork'에서 관련 구절을 추가했습니다. –

3

@Matthew가 대답으로 쓴 것처럼 부모 프로세스의 다른 스레드는 자식 프로세스에 존재하지 않습니다 (PThread를 사용하는 경우).

그렇지 않은 경우 exec() 호출을 "fork"호출 직후에 배치하는 것이 도움이되지 않습니다. 호출하기 전에 다른 스레드가 계속 실행될 가능성이 있기 때문에 fork에 대한 호출이 계속 실행됩니다. exec(). 그러나 fork()를 호출하기 전에 뮤텍스를 잠그면이 문제를 제어 할 수 있습니다. exec()를 호출하면 mutex는 기본적으로 파괴됩니다.

+0

+1 두 번째 단락의 설명. –

+0

뮤텍스가 "본질적으로 파괴되었습니다." 위에서 말했듯이 자물쇠가 일관성없는 상태에 빠질 위험이 있습니다. 그것이'pthread_atfork'가 존재하는 이유입니다. –

0

나 역시 모든 스레드가 하위 프로세스에서도 복제 될 것이라고 생각했습니다. 하지만 사실이 아닙니다. 자식 프로세스에서 다른 스레드가 복제되지 않기 때문에 exec 전에 mutexes/locks를 사용하는 경우 fork 처리기가 올바르게 처리되도록 작성해야합니다. 여기에 기사가 있습니다. http://learnwithtechies.com/tech/index.php?option=com_content&view=article&id=15:fork-in-multithreaded-environment&catid=10:unix