2014-05-12 3 views
1

나는 여러 번 포크를 순차적으로 (그리고 동시에) 실행하지 않는 프로그램을 가지고있다.포크를 여러 번 실행할 위험이 있습니까?

이러한 문제가 발생할 수있는 위험은 무엇입니까? 몇 번 내가 여러 번

+4

'fork'는 새로운 프로세스를 시작합니다. 2 천만 번 새로운 프로세스를 시작할 때 무엇이 ​​잘못 될 수 있습니까? – Jon

+1

포크 폭탄 : 예 : http://en.wikipedia.org/wiki/Fork_bomb – fedorqui

+0

실패 후 errno의 값을 확인하십시오. 어떤 오류가 보이나요? – harmic

답변

3

The Open Group Base Specifications Issue 7, IEEE Std 1003.1, 2013 Edition 실행 포크 후 포크 오류 때문에

은 꽤 명확하게 무슨 일 수 있습니다 설명 :

포크() 함수를 이루지 못한 경우 :

[EAGAIN] 시스템에 다른 프로세스를 생성하는 데 필요한 리소스가 없거나 시스템 전체 또는 단일 사용자 ({CHILD_MAX})가 실행중인 총 프로세스 수에 대한 시스템 부과 된 제한을 초과했습니다.

[ENOMEM] 불충분 한 저장 공간을 사용할 수있다 :

포크() 함수는 경우 실패 할 수있다.

자녀 프로세스가 오래 실행되지 않으며 한 번에 너무 많은 활성이 있어서는 안됩니다. 이 경우 문제는 부모 프로세스가 "zombie processes"(프로세스 테이블에서 슬롯을 차지했지만 여전히 종료 된 것)를 떠나는 것일 수 있습니다. wait을 호출하여 하위 노드를 정리하지 못하게됩니다. wait을 동 기적으로 호출 할 수 있습니다. 부모 프로세스가 하위 프로세스가 실행 및 종료 될 때까지 기다리는 것보다 더 좋은 방법이 없거나 SIGCHLD 신호에 대한 응답으로 wait으로 호출 할 수 있습니다. 기쁜 소식은 waitwaitpidasync-signal-safe이므로 신호 처리기에서 안전하게 호출 할 수 있으며 프로그램의 기본 흐름을 그대로 유지할 수 있습니다.

1

자신의 UNIX/Linux 시스템을 사용하고 있다면 시도해 보시기 바랍니다. 일반 사용자로

int main(int argc, char *argv[]) { 
    while(true) { 
     int rc = fork(); 
     if(rc == -1) { 
      perror("fork failed"); 
     } 
    } 
} 

를 실행 :

는 C 프로그램을 컴파일한다. 무슨 일이 일어나는지보십시오.

루트로 실행하십시오. 시스템이 멈추는 지 조심하십시오. 복구하려면 재부팅해야합니다.

fork()은 시스템 호출이며 코드는 이어야합니다. 항상은 시스템 호출의 오류를 검사하므로 실패한 이유에 대한 정보가 있어야합니다. 이는 malloc() 또는 fopen()과 같은 다른 시스템 호출에도 해당됩니다.

관련 문제