Функция fork () - PullRequest
       41

Функция fork ()

0 голосов
/ 29 ноября 2018

У меня есть следующий код со всеми системными вызовами, успешно выполняемыми во время выполнения:

#include <unistd.h>
int main(int argc, char *argv[])
{
  for (; argc > 1; argc--) {
    if (0 == fork()) {
        (void) fork();
    }
  }
}

Мне нужно выяснить, сколько дочерних процессов я получу.Если я применяю один аргумент, то функция fork () в fork () == 0 сгенерирует одного родительского и одного дочернего процесса, а (void) fork () то же самое => 2 дочерних процесса. Если я применяю 2 аргумента, число будет простобыть двойнымЭто правильное мышление?

1 Ответ

0 голосов
/ 29 ноября 2018

с использованием следующего кода:

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

int main(int argc, char *argv[])
{
  for (; argc > 1; argc--) {
    if (0 == fork()) {
        (void) fork();
    }
    puts( "mark" );
  }
}

здесь приведен результат нескольких прогонов с 0, 1, 2 параметрами

richard@richard-desktop:~/Documents/forum$ ./untitled2 
richard@richard-desktop:~/Documents/forum$ ./untitled2 1
mark
mark
mark
richard@richard-desktop:~/Documents/forum$ ./untitled2 1 2
mark
mark
mark
mark
mark
mark
mark
mark
richard@richard-desktop:~/Documents/forum$ mark
mark
mark
mark

Обнаружена проблема, возникшая в результате «гонки»условия?

Один из способов решения проблемы гонки - это wait() для завершения всех дочерних процессов перед запуском другого набора дочерних процессов

IE

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>


int main(int argc, char *argv[])
{
  for (; argc > 1; argc--) {
    if (0 == fork()) {
        (void) fork();
    }
    puts( "mark" );
    while( wait( NULL ) != -1 );
  }
}

КакойРезультаты в очень удобочитаемом:

richard@richard-desktop:~/Documents/forum$ ./untitled2 
richard@richard-desktop:~/Documents/forum$ ./untitled2 1 
mark
mark
mark
richard@richard-desktop:~/Documents/forum$ ./untitled2 1 2
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
...