나에게 주어진 과제는 숫자를 나눌 수 있는 모든 숫자(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>
.
첫 번째 옵션은 일시적으로 많은 수의 좀비를 발생시키지만 두 번째 옵션은 병렬성을 제거합니다.