Порождает произвольное количество дочерних процессов? - PullRequest
1 голос
/ 02 октября 2019

Мне нужна помощь с программированием на C, у меня есть вопрос, который требует от меня создания произвольного числа дочерних процессов, каждый из которых выполняет функцию дочернего процесса. Предполагается, что число дочерних процессов указывается в качестве аргумента командной строки, и в функции дочернего процесса она должна выполнить случайное число итераций в простом цикле, а затем вывести «Child X», где X предоставляется в качестве аргумента. Если бы кто-нибудь мог помочь мне в этом, это было бы здорово!

Я пробовал это, но я не понимаю, как процессы работают в C.

Измененный код

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(int argc, char **argv) {

  int counter;
  pid_t pid = getpid();
  int x = atoi(argv[1]);  // Changed (added)

  printf("Parent Process, my PID is %d\n", pid);

  for(counter=1;counter <= x;counter++){  // Changed
    if(!fork()){
      printf("Child %d is born, my PID is %d\n", counter, getpid());  // Changed
      childprocess(counter);
      printf("Child %d dies\n", counter);
      exit(0);
    }
  }
}

void childprocess(int num){
  int i = 1;

  while(i <= num){
    printf("Child %d executes iteration: %d\n", num, i);  // Changed
    i++;
  }

}

Оригинальный код

    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>

    int main(int argc, char **argv) {

      int counter;
      pid_t pid = getpid();

      printf("Parent Process, my PID is %d\n", pid);

      for(counter=1;counter <= argv[1];counter++){
        if(!fork()){
          printf("Child %d is born, my PID is %d\n", counter, pid);
          childprocess(counter);
          printf("Child %d dies\n", counter);
          exit(0);
        }
      }
    }

    void childprocess(int num){
      int i = 1;

      while(i <= num){
        printf("Child %d executes iteration: %d\n", i);
        i++;
      }

    }

Ответы [ 2 ]

3 голосов
/ 02 октября 2019

Значение pid всегда соответствует родительскому значению. Было бы раскошелиться, но распечатать тот же номер. Попробуйте:

printf("Child %d is born, my PID is %d\n", counter, getpid());

, чтобы получить PID ребенка после развилки. Бит printf("Child %d executes iteration: %d\n", i); имеет 2%, но только одно значение. Попробуйте

printf("Child %d executes iteration: %d\n", num, i);
2 голосов
/ 02 октября 2019

Вот простая адаптация «Измененного кода» (начиная с редакция 4 ):

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void childprocess(int num);

int main(int argc, char **argv)
{
    if (argc != 2)
    {
        fprintf(stderr, "Usage: %s num-procs\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    int counter;
    pid_t pid = getpid();
    int x = atoi(argv[1]);

    printf("Parent Process, my PID is %d\n", pid);

    for (counter = 1; counter <= x; counter++)
    {
        if (!fork())
        {
            printf("Child %d is born, my PID is %d\n", counter, getpid());
            childprocess(counter);
            printf("Child %d dies\n", counter);
            exit(0);
        }
    }
}

void childprocess(int num)
{
    srand(getpid());
    int max = rand() % 100;

    for (int i = 0; i < max; i++)
    {
        printf("Child %d executes iteration: %d\n", num, i);
    }
}

Пример вывода (программа procs13 составлена ​​из procs13.c):

$ procs13 3
Parent Process, my PID is 23487
Child 1 is born, my PID is 23488
Child 1 executes iteration: 0
Child 1 executes iteration: 1
Child 1 executes iteration: 2
Child 1 executes iteration: 3
Child 1 executes iteration: 4
Child 1 executes iteration: 5
Child 1 executes iteration: 6
Child 1 executes iteration: 7
Child 1 executes iteration: 8
Child 1 executes iteration: 9
Child 1 executes iteration: 10
Child 1 executes iteration: 11
Child 1 executes iteration: 12
Child 1 executes iteration: 13
Child 1 executes iteration: 14
Child 1 executes iteration: 15
Child 1 dies
Child 2 is born, my PID is 23489
Child 2 executes iteration: 0
Child 2 executes iteration: 1
Child 2 executes iteration: 2
Child 2 executes iteration: 3
Child 2 executes iteration: 4
Child 2 executes iteration: 5
Child 2 executes iteration: 6
Child 2 executes iteration: 7
Child 2 executes iteration: 8
Child 2 executes iteration: 9
Child 2 executes iteration: 10
Child 2 executes iteration: 11
Child 2 executes iteration: 12
Child 2 executes iteration: 13
Child 2 executes iteration: 14
Child 2 executes iteration: 15
Child 2 executes iteration: 16
Child 2 executes iteration: 17
Child 2 executes iteration: 18
Child 2 executes iteration: 19
Child 2 executes iteration: 20
Child 2 executes iteration: 21
Child 2 executes iteration: 22
Child 2 dies
Child 3 is born, my PID is 23490
Child 3 executes iteration: 0
Child 3 executes iteration: 1
Child 3 executes iteration: 2
Child 3 executes iteration: 3
Child 3 executes iteration: 4
Child 3 executes iteration: 5
Child 3 executes iteration: 6
Child 3 executes iteration: 7
Child 3 executes iteration: 8
Child 3 executes iteration: 9
Child 3 executes iteration: 10
Child 3 executes iteration: 11
Child 3 executes iteration: 12
Child 3 executes iteration: 13
Child 3 executes iteration: 14
Child 3 executes iteration: 15
Child 3 executes iteration: 16
Child 3 executes iteration: 17
Child 3 executes iteration: 18
Child 3 executes iteration: 19
Child 3 executes iteration: 20
Child 3 executes iteration: 21
Child 3 executes iteration: 22
Child 3 executes iteration: 23
Child 3 executes iteration: 24
Child 3 executes iteration: 25
Child 3 executes iteration: 26
Child 3 executes iteration: 27
Child 3 executes iteration: 28
Child 3 executes iteration: 29
Child 3 dies
$

Я немного удивлен, что не показан параллелизм, но именно так он работал на моем Mac с MacOS Mojave 10.14.6. Большие числа в итерациях, вероятно, дадут чередующееся выполнение дочерних процессов. Вероятно, родительский процесс должен использовать wait() или waitpid(), чтобы дождаться смерти детей.

...