포크를 사용하여 계산의 부분 결과를 계산하는 방법은 무엇입니까?

포크를 사용하여 계산의 부분 결과를 계산하는 방법은 무엇입니까?

나에게 주어진 과제는 숫자를 나눌 수 있는 모든 숫자(x라고 부르자)를 모두 찾아 몇 번이나 나눌 수 있는지 알아내는 것입니다.
포크를 사용해야 함작업을 수행합니다.
내가 생각해낸 것은 숫자를 x로 나눈 횟수를 세는 함수를 작성한 다음 for 루프에서 실행했더니 제대로 작동했다는 것입니다. 하지만 포크를 사용하여 "병렬화"하고 싶습니다. 가능합니까?

내 C 함수는 다음과 같습니다

int check_dividers(int *x, int i)
{
  int c = 0;

  if (*x % i == 0)
  {
    do
    {
      c++;
      *x = *x / i;
    } while (*x % i == 0);
  }

  return c;
}

각 계산을 수행하고 출력 파일에 기록하기 위해 새 프로세스를 생성하려고 시도했지만 엉망이 되었습니다.

 int i = 2;

  while (i < x && x != 0)
  {
    if (x % i == 0)
    {
      pid_t pid;

      if ((pid = fork()) < 0)
      {
        perror("error during fork");
        exit(0);
      }
      else
      {
        if (pid == 0)
        {
          int num_dividers = check_dividers(&x, i);

          fprintf(out, "%d: %d\n", i, num_dividers);
          fflush(out);
        }
      }
    }
    i++;
  }

x = 315이면 내 출력

3: 2
5: 1
7: 1
21: 1
9: 1
5: 1
15: 1
9: 1
7: 1
63: 1
7: 1
105: 1
15: 1
9: 1
35: 1
45: 1
21: 1

답변1

작업이 완료된 후 하위 프로세스가 종료되지 않는 경우가 발생합니다. 모든 프로세스는 외부 루프의 자체 인스턴스를 실행합니다.

헹궈 내야 합니다 exit(0).

wait아이들에게도 해줘야 합니다 .
(1) 끝에서 while (wait(NULL) != -1);또는 (2) 각 절차 후에 waitpid(pid, NULL, 0);after 를 사용하여 이 작업을 수행할 수 있습니다. if ((pid = fork()) < 0) { ... } else { ... }
include 가 필요합니다 <sys/wait.h>.

첫 번째 옵션은 일시적으로 많은 수의 좀비를 발생시키지만 두 번째 옵션은 병렬성을 제거합니다.

관련 정보