2011-08-25 6 views
1

fork()를 몇 번 호출하여 4 개의 하위 프로세스를 생성하는 perl 스크립트가 있습니다. 그런 다음 부모 프로세스는 waitpid()를 사용하여 모든 자식이 완료 될 때까지 대기합니다.fork() 후 실패한 Perl system() 명령

자식 프로세스 내에서 system()을 호출하려고 할 때 문제가 발생합니다 (디렉토리를 만드는 데 사용하고 있습니다). 시스템 ("dir")과 같은 간단한 것조차도 실패합니다 (예, 저는 Windows에 있습니다).

"실패"로 말하면, 자식 스레드 중 하나가 아무런 문제가 없지만 다른 자식 프로세스가 지금까지 존재하지 않는다는 것을 의미합니다.

trace INFO, "Thread $thread_id still alive at 2.62"; 
system("dir"); 
trace INFO, "Thread $thread_id still alive at 2.65"; 

"Thread 3 still alive at 2.62"와 같은 메시지가 표시되지만 하위 스레드 중 하나만 2.65가됩니다.

로그 맨 아래에서 "0이 아닌 상태 127로 종료 된 명령"을 볼 수 있습니다.이 명령과 관련이있을 수 있습니다.

일종의 뮤텍스 잠금을 사용하여 한 번에 하나의 프로세스 만 시스템 호출을 통과하는 것을 고려했지만 어떻게 fork()를 사용하여이를 수행 할 수 있습니까? 또한이 문제는 처음부터 실제로 의미가 없습니다. 왜 여러 독립 프로세스가 동시에 시스템 ("dir")을 수행하는 데 문제가 있습니까?

+1

왜'system()'을 사용하여 디렉토리를 만드나요? – TLP

+0

사용중인 펄의 버전은 무엇입니까? 스레드로부터 안전합니까? –

+0

우리는 문제를 재현 할 수있는 (최소한의) 코드를 제공 할 수 있습니까? – ikegami

답변

2

여기서 문제는 fork()이 스레드를 사용하여 Windows에서 에뮬레이트된다는 것입니다. 따라서 실제로 만들어진 프로세스가 없습니다.

당신은 폴더를 만들 수 사용하는 시스템 호출 인 경우에, 당신은 더 나은 펄 기능 mkdir 또는 File::Pathmake_path를 대신 사용하십시오.

+0

각 스레드가 자신의 CPU 코어에서 실행 중입니다. 관련성이 있습니까? (나는 쿼드 코어 CPU를 가지고 있으며 4 개의 스레드를 실행하면 100 %가되고 병렬 처리가없는 경우는 25 %가됩니다.) – numegil

+0

스레드가 메모리를 공유하고 있습니다. 아마도'system'은 어떤 내부 구조에 대한 독점적 인 접근을 필요로 할 것입니다 (그러나 새로운 * process *가 생성되지 않기 때문에 공유됩니다). –

+1

@Ivan Nevostruev, 당신이 말하는 것을 분명하지 않지만, 만약 당신이'system '새로운 프로세스를 만들지는 않는다. – ikegami

관련 문제