fork () в C: подсчет от 1 до 1000

#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. Это не устраняет проблему.