2010-12-06 2 views
3

프로세스에 스레드가 여러 개있는 경우 fork()의 ​​동작은 정의되지 않습니다. 어떻게하면 하나의 스레드 (리눅스에서는 주로, 윈도우즈, 다윈 (darwin)도 관심 대상 임) 만 있는지 확인할 수 있습니까?fork()가 안전한지 확인

+1

'여기에 의견 입력' –

+0

대기. 왜 이것이 진짜 질문이 아닌가? 제가 놓친 편집이 있었습니까? (편집 역사는 보이지 않습니까?) –

+0

@Matti Virkkunen : 원래 게시 된 질문에는 본문이 없습니다 (단지 여기에 코드 입력) 및 완전히 다른 제목이 있습니다. – eldarerathis

답변

2

Linux에서 fork()의 ​​동작은 멀티 스레드 프로세스에서는 정의되지 않지만 일반적으로 도움이되지 않는 작업을 수행합니다.

또는 fork()를 호출하고 즉시 exec()를 호출하지 않으면 교착 상태를 유발할 수있는 잠금을 포함하여 지정되지 않은 리소스가 누출 될 위험이 있습니다.

Linux (procfs를 통해)에게 현재 스레드 그룹에있는 스레드 수를 물어볼 수 있습니다. 대답이 하나라면 프로세스가 단일 스레드임을 의미합니다.

+0

네, 그게 제가 끝낸 것입니다 (procfs 것). 우리는 다윈이 소매를 어떻게 처리하는지 보게 될 것입니다. – melisgl

+0

프로세스에 정확히 하나의 스레드가 있음을 확인한 후에는 포크를 만들기 전에 새 프로세스를 시작하는 신호 처리기가 없습니다. 그럴 가능성은 희박합니다. – MarkR

2

이 작업을 수행 할 수 없습니다. pthreads를 사용하면 pthread_is_multithreaded_np() 함수를 사용할 수 있지만 fork() 코드는 pthreads에 종속적 일 수 있으며 모든 플랫폼에서 작동하지는 않습니다. 그리고 스레딩 라이브러리에 관계없이 검사를 수행 할 방법이 없습니다.

응용 프로그램 인 경우 스레드와 포크를 동시에 사용하지 마십시오. 스레드 된 프로그램을 작성하는 경우 fork()을 호출하지 마십시오 (fork/execv 콤보 제외).

라이브러리 인 경우 fork()을 사용하지 않거나 라이브러리가 스레드 된 응용 프로그램과 함께 사용되지 않도록해야합니다.

응용 프로그램의 경우 pthread_atfork(...)을 사용하여 fork()에 안전하게 전화를 걸 수 있습니다.

+0

pthread_is_multithreaded_np는 쓰레드 생성이 내 통제 범위를 벗어나는 것입니다. – melisgl

+0

Bah, Linux에서는 pthread_is_multithreaded_np()를 사용할 수 없습니다. – melisgl

관련 문제