2009-09-04 3 views
6

어떻게 fork() 명령을 사용하여 10 개의 프로세스를 생성하고 동시에 작은 작업을 수행 할 수 있습니까?다중 fork() 동시성

Concurrent는 작동 단어이므로 fork를 사용하는 방법을 보여주는 많은 곳에서 데모에서 fork()를 한 번만 호출하면됩니다. 어떤 종류의 for 루프를 사용할 것이라고 생각했지만 시도해 보았습니다. fork()가 새로운 프로세스를 생성하고 작업을 수행 한 다음 새 프로세스를 생성한다는 것이 내 테스트에서 보이는 것입니다. 그래서 그들은 순차적으로 실행되고있는 것처럼 보입니다. 그러나 동시에 포크를 포크 (fork) 할 수 있고 그것이 의미가있는 경우 10 개의 프로세스가 동시에 작업을 수행 할 수 있습니까?

감사합니다.

업데이트 : 답변들에 대한 덕분에, 난 그냥() 처음에 포크의 일부 측면을 오해 생각하지만 난 지금 그것을 이해합니다. 건배.

+2

BTW-- 또는 스레드 : 여기 튜토리얼입니다. 원하는 태그가 [멀티 프로세싱] 태그 인 경우 – dmckee

+0

네가 맞다 –

답변

15

전화 fork() :

추가 코드는 코멘트를 어린이를위한 대기 :

int numberOfChildren = 10; 
pid_t *childPids = NULL; 
pid_t p; 

/* Allocate array of child PIDs: error handling omitted for brevity */ 
childPids = malloc(numberOfChildren * sizeof(pid_t)); 

/* Start up children */ 
for (int ii = 0; ii < numberOfChildren; ++ii) { 
    if ((p = fork()) == 0) { 
     // Child process: do your work here 
     exit(0); 
    } 
    else { 
     childPids[ii] = p; 
    } 
} 

/* Wait for children to exit */ 
int stillWaiting; 
do { 
    stillWaiting = 0; 
    for (int ii = 0; ii < numberOfChildren; ++ii) { 
     if (childPids[ii] > 0) { 
      if (waitpid(childPids[ii], NULL, WNOHANG) != 0) { 
      /* Child is done */ 
      childPids[ii] = 0; 
      } 
      else { 
      /* Still waiting on this child */ 
      stillWaiting = 1; 
      } 
     } 
     /* Give up timeslice and prevent hard loop: this may not work on all flavors of Unix */ 
     sleep(0); 
    } 
} while (stillWaiting); 

/* Cleanup */ 
free(childPids); 
+1

나는 'break -> exit'라고 쓰고 싶다 –

+2

오. 그렇지 않으면 제한된 포크 폭탄을 초대합니다. –

+0

감사합니다. 나는 갱신했다. –

3

각각의 특정 작업을 할당하면서 하나의 자식을 생성하는 "기본"프로세스에서 루프 만 수행하면됩니다.

4

프로세스를 포크 할 때 동시에 실행됩니다. 하지만 사용 가능한 유휴 프로세서가 충분하지 않으면 실제로는 동시에 실행되지 않을 수도 있습니다. 실제로는 아무 문제가 없습니다 ...

두 번째 단락은 포크 작동 방식을 이해하지 못하는 것처럼 보입니다. 부모 또는 분기 된 프로세스에 있는지 확인하기 위해 리턴 코드를 점검하십시오. 따라서 부모는 10 개의 프로세스를 포크하는 루프를 실행하게하고, 자식은 동시에 수행하고자하는 작업을 수행합니다. 루프에서

0

또한 POSIX 스레드 (또는의 pthreads)에보고 할 수 있습니다. (태그와 같이) 당신이 * 정말 * (텍스트에서와 같이) 프로세스를 원하십니까

https://computing.llnl.gov/tutorials/pthreads/

+0

pthreads 작동 방식을 알고 있습니다. 전에 필자가 코딩 한 코드입니다. –