fork(2) 매뉴얼 페이지에서:
RETURN VALUE
On success, the PID of the child process is returned in the parent, and
0 is returned in the child. On failure, -1 is returned in the parent,
no child process is created, and errno is set appropriately.
포크 호출이 실패하는 원인이 무엇인지 알고 싶습니다. 포크가 -1을 반환하는 상황은 무엇입니까?
저는 C로 표준 Unix 쉘을 작성하고 있습니다. 이 오류를 어떻게 처리해야 합니까?
답변1
C API에서 시스템 호출은 오류를 나타 내기 위해 음수 값을 반환하고 오류 코드는 errno
오류의 성격에 대한 자세한 정보를 제공합니다. 매뉴얼 페이지에서는 시스템에서 발생할 수 있는 오류를 설명해야 합니다. 거기 두 개 있어기준에러 코드:
EAGAIN
사용 가능한 리소스 부족으로 인해 새 프로세스를 생성할 수 없음을 나타냅니다(일종의 메모리 부족 또는 제한에 도달함(예: 사용자당 또는 전체 최대 프로세스 수)).ENOMEM
메모리 부족으로 인해 새 프로세스를 생성할 수 없음을 나타냅니다. Linux에서ENOMEM
이는 커널 메모리 부족을 나타내는 반면, 사용자 모드 메모리 부족은 로 보고됩니다EAGAIN
. OpenBSD에서는ENOMEM
사용자 공간의 메모리 부족 문제를 해결하는 데에도 사용됩니다.
요약하자면, fork
사용 가능한 리소스가 부족하여(단순한 메모리 부족이 아닌 인위적인 제약의 형태로) 실패할 수 있습니다.
fork
POSIX는 실패 시 쉘의 동작을 지정하지 않습니다. 실제로 서로 다른 오류 상태를 반환하는 경향이 있습니다(pdksh에서 1, ash에서 2, bash에서 254, ksh93에서 258, tcsh에서 1, zsh는 오류인 0을 반환함). 학습 연습이 아닌 프로덕션 용도로 셸을 구현하는 경우 추가하는 것이 좋습니다.오스틴 그룹메일링 리스트.
답변2
커널에는 NPROC
동시에 실행할 수 있는 최대 프로세스 수를 알려주는 매개변수가 있다는 것을 알고 있습니다. 이미 최대값에 도달하여 다른 것을 만들려고 하면 커널에 의해 거부되고 부모에게 -1이 반환될 것입니다.
반면에 커널은 사용자별 프로세스 제한도 매개변수에 저장합니다 MAXUPRC
. 위와 동일한 혜택이 적용됩니다.
답변3
한 가지 가능한 이유는 할당량 제약이나 일부 시스템 결함으로 인해 새 프로세스를 생성할 수 없다는 것입니다.
소프트웨어를 작성할 때 무언가가 실패할 수 있는 이유를 항상 알 수는 없지만 모든 단계에서 오류를 처리할 수 있는 잘 정의된 방법을 갖는 것은 항상 좋은 생각입니다.