#c #process #fork
#c #процесс #fork
Вопрос:
Я думаю, что я очень близок, но здесь отсутствуют некоторые детали.
Задача: написать программу на C, которая создает отцовский и дочерний процессы. Отец и потомок оба считают от 1 до 1000, «используя» цикл. Родительский процесс считает только четные числа, в то время как дочерний процесс считает только нечетные числа.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
void main (){
int id = fork();
int i;
if (id == 0){
for (i=1;i<=1000;i=i 2){
printf("%dn",i);
}
}
if (id > 0){
for (i=0;i<=1000;i=i 2){
printf("%dn",i);
wait(0);
}
}
}
Проблема, с которой я столкнулся, заключается в том, что все числа полностью перепутаны.
Кажется, что мой системный вызов wait работает некорректно: (
Я ценю любую помощь. Заранее спасибо 🙂
Комментарии:
1.
main()
должно бытьint
, нетvoid
.2. Прочитайте документацию
wait()
; он не делает того, что вы, кажется, думаете. Предполагая, что вы хотите видеть все числа по порядку, вам нужна какая-то форма синхронизации между двумя процессами, например, семафор. Для правильного выполнения потребуется немало работы; Боюсь, вы еще не совсем «близки».3. Это не должно их всех смешивать. Сначала должны быть либо все нечетные числа, либо все нечетные числа от 0 до 2.
4. Вы ожидаете, что числа будут напечатаны по порядку? Ничто в задаче не говорит, что это требование.
5. Да, это то, чего я ожидаю. Итак, мне нужен семафор здесь?
Ответ №1:
Your wait system call should placed out of for loop, because there's only one child process to wait.
like that
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
void main (){
int id = fork();
int i;
if (id == 0){
for (i=1;i<=1000;i=i 2){
printf("%dn",i);
}
}
if (id > 0){
for (i=0;i<=1000;i=i 2){
printf("%dn",i);
}
wait(0);
}
}
Комментарии:
1. Это не устраняет проблему.