2017-05-20 24 views
1

기계 구성에 따라 fork$? == 11을 호출하는 동안 Perl 스크립트를 상속 받았습니다. errno.hvariousposts에 따르면포크가 "리소스를 일시적으로 사용할 수 없습니다"와 함께 실패합니다. 어떤 리소스?

, 11은 일부 자원이 일시적으로 사용할 수 있었기 때문에 즉, "다시 시도"EAGAIN입니다.

실패 분기점 발생하는 자원을 결정하는 방법이 있고, 하나 하여 다양한 시스템 제한 하나씩 증가 이외 (open file descriptors, swap space 또는 allowable threads 의 수)?

+0

분기 된 프로세스는 원래 프로세스의 완전한 복제본입니다. 포크 전에 프로세스를 프로파일 링하면 사용중인 각 리소스의 양을 파악할 수 있습니다. – alvits

+0

$! = 11을 의미합니까? – ikegami

+0

'당신은 $! = 11을 의미합니까? '. 사실, 나는 다소 어긋난다. 내가 말했어야 할 것은 포크가 성공했지만'wait '에 의해보고 된 상태 코드 11로 즉시 끝납니다. – phonybone

답변

2

내 시스템에 fork man 페이지는 말한다, 당신이 $!EAGAIN 의미 가정 :

EAGAIN : 부모의 페이지 테이블을 복사하고 자식에 대한 작업 구조를 할당하기에 충분한 메모리를 할당 할 수 없습니다 포크().

EAGAIN : 호출자의 RLIMIT_NPROC 자원 제한이 발생 했으므로 새 프로세스를 만들 수 없습니다. 이 제한을 초과하려면 프로세스에 CAP_SYS_ADMIN 또는 CAP_SYS_RESOURCE 기능이 있어야합니다.

엄청난 양의 프로세스를 만들려고하십니까? 그들이 끝나면 자녀를 거두고 있습니까?

+0

원래 질문에 대한 설명을 보려면 위의 내 의견을 참조하십시오. 이는 내 부분에 지나치게 단순화 된 내용이었습니다. 실제 이벤트 시퀀스는 다음과 같습니다. 초기화 후 프로그램은 system()에 대한 호출을 통해 큰 (8Gb) 파일을 사전 처리합니다. 그런 다음 프로그램은 시스템의 각 CPU 코어에 대해 하나의 프로세스를 생성합니다. 따라서 프로그램은 포크 (그러나 리눅스는 카피 - 쓰는 것이므로 괜찮을 것입니다.) 때 매우 큰 메모리 공간을 복사하려고 시도 할 수 있습니다. 많은 양의 RAM (184Gb)이 있으며 허용되는 열린 파일 수와 스왑 공간이 증가했습니다. – phonybone

+0

포크 중 일부는 성공하고 일부는 실패하고 전반적인 포크의 수를 제한하면 프로그램을 정상적으로 실행시킬 수 있습니다. – phonybone

+0

다시 "* 포크가 성공적으로 *", & "* 포크 중 일부는 성공하고 일부는 실패 *", 어느 쪽입니까? 어떤 전화가 실패 했나요? 왜 어떤 오류가 발생했는지 확인하지 않는 이유는 무엇입니까? – ikegami