2016-09-15 5 views
1

Я пытаюсь сделать процессор фермы в C. Я начала с очередями открытия сообщения, а затем попытаться сделать рабочие процессы: (обратите внимание, что NROF_WORKERS является 5)только 1 ребенок после 5 вилок (C)

static void 
makechildren (void) { 
    // Only the parent should fork. Any children created will become workers. 
    pid_t processID; 
    pid_t farmerPID = getpid(); // To identify who the farmer is 

    // Loop creating processes, indexed by NROF_WORKERS 
    int i = 0; 
    while (i < NROF_WORKERS){ 
     if (getpid() == farmerPID){ 
      i++; 
      printf ("Parent is creating a child!%d\n", getpid()); 
      processID = fork(); 
     } 
    } 

    if (processID < 0){ 
     perror("fork() failed"); 
     exit(1); 
    } 
    else { 
    // If parent, start farming 
     if (processID == farmerPID) { 
      printf("Parent reporting in!%d\n"); 
     } 
    // If child, become a worker 
     if (processID == 0) { 
      printf("Child reporting in!%d\n", getpid()); 
      join(); 
     } 
    } 
} 

Как вы можете видеть, я хочу, чтобы родитель сообщал обо всех случаях создания ребенка, а потом я хочу, чтобы родитель и все дети сообщали об этом. Однако, все это я получаю:

Parent is creating a child!11909 
Parent is creating a child!11909 
Parent is creating a child!11909 
Parent is creating a child!11909 
Parent is creating a child!11909 
Child reporting in!11914 

Теперь я заметить разницу в 11909 и 11914 5. Так что мой вопрос: создаются другие процессы? Если да, то почему они не сообщают? А если нет, что я делаю неправильно? Кроме того, родитель не сообщает вообще, как это вызвано?

ответ

2

Все дети будут созданы, но бесконечный цикл в цикле while, поскольку i увеличивается только для родителя:

int i = 0; 
while (i < NROF_WORKERS){ 
    if (getpid() == farmerPID){  
     i++;    // <---- This is happening for the parent process only. 
     printf ("Parent is creating a child!%d\n", getpid()); 
     processID = fork(); 
    } 
} 

Единственный ребенок прекратить является последним, для которого i равна NROF_WORKERS.

Также родитель «не сообщает», так как processID вы проверяете равным родителю PID никогда не равна ей, так как она равна последней fork результата, т.е. последнего созданного ребенка PID:

......... 
processID = fork(); 
......... 
......... 
if (processID == farmerPID) { 
      printf("Parent reporting in!%d\n"); 
} 
0

Вы всегда печатаете farmerPid! Но, как сообщение выводится в 5 раз, вы фактически создали 5 процессов:

while (i < NROF_WORKERS){ 
    if (getpid() == farmerPID){ 
     i++; 
     printf ("Parent is creating a child!%d\n", getpid()); 
     processID = fork(); 
    } 
} 

Если вы хотите напечатать детей ИДП, то ваш код должен делает разницу между родителем и ребенком, как в:

while (i < NROF_WORKERS){ 
    if (getpid() == farmerPID){ 
     i++; 
     printf ("Parent is creating a child!\n"); 
     processID = fork(); 
     if (processID==0) { // child 
      printf("I am the child %d\n",getpid()); 
     } else { // parent 
      printf("Parent just created child %d\n",processID); 
     } 
    } 
}