#c #unix #fork
#c #unix #вилка
Вопрос:
У меня есть следующее задание (это не домашнее задание, это больше для подготовки к моему курсу ОС):
Реализуйте программу для проверки гипотезы Коллатца для большего числа заданных чисел. Начиная с одного родительского процесса, создается по одному для каждого дочернего процесса, чтобы проверить гипотезу коллатца для одного числа. Родитель будет ждать, пока каждый ребенок закончит программу, и докажет это поведение с помощью getpid(2) и getppid(2). Пример:
$ ./ ncollatz 9 16 25 36 Starting parent 6202 9: 9 28 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1. 36: 36 18 9 28 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1. Done Parent 6202 Me 40018 Done Parent 6202 Me 30735 16: 16 8 4 2 1. 25: 25 76 38 19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1. Done Parent 6202 Me 13388 Done Parent 6202 Me 98514 Done Parent 58543 Me 6202
Вот это то, что я пробовал:
#include lt;stdio.hgt; #include lt;errno.hgt; #include lt;unistd.hgt; void COLLATZ(int val){printf("DONE COLLATZ FOR %dn", val);} int main(int argc, char** argv){ printf("Starting parent%dn", getppid()); for(i = 1; i lt; argc; i){ pid_t pid = fork(); if(pid lt; 0){printf("Error n"); return errno;} else if(pid == 0) { int val = atoi(argv[i]); COLLATZ(val); printf("Done Parent %d ME %dn", getppid(), getpid()); } } return 0; }
Результат, который я получаю, таков:
Starting parent 61599 Done Parent 61599 ME 32057 DONE COLLATZ FOR 9 DONE COLLATZ FOR 16 DONE COLLATZ FOR 25 DONE COLLATZ FOR 36 Done Parent 61599 ME 32057 Done Parent 61599 ME 32057 Done Parent 61599 ME 32057 Done Parent 61599 ME 32057
Что, кажется, совсем не нормально. Как я мог заставить его работать хорошо? Кроме того, я не реализовал тестирование гипотезы collatz, потому что это тривиально и не так важно для того, чего я не понимаю;