2014-09-16 2 views
2

Я пишу программу на C, которая использует команду fork и петли 10 раз, в то же время идентификатор процесса будет отображаться в каждом цикле.C программируемая команда в цикле for

Ниже приведены мои коды:

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

main() 
{ int x; 
    for(x=0;x<10;x++) 
    { 
    fork(); 
    printf("The process ID (PID): %d \n",getpid()); 
    } 
} 

Мои коды генерируют многочисленные из идентификатора процесса, там ничего плохого в программе?

+1

Вы должны размещать или, по крайней мере, более подробно описать, вывод, который вы получите, и сказать, что вы ожидали получить. – ams

ответ

5

fork() Системный вызов создает дочерний элемент, который выполняет тот же код, что и родительский. С этого момента выполняется 2 процесса, выполняющих следующую строку: родительский и дочерний. Каждый из них выполняет команду printf().

Второй раз цикл for выполняется, то выполняется родителем и ребенка: каждый из них выполнять fork(), и поэтому с этого момента есть 4 процесса: 2 первых из них, а также их новые дети ,

Итак, для каждой итерации в цикле вы удваиваете количество процессов. Общее число процессов, таким образом, 2^10 = 1024.

Таким образом, printf() внутри цикла for выполняется:

  • 10 раз в течение первых 2 процессов
  • 9 раз для своих детей (2) процессы
  • 8 раз для следующего поколения (4 новых детей)
  • 7 раз для следующего (8 детей)
  • 6 раз FOT следующего (16 детей)
  • 5 раз для следующего (32 детей)
  • 4 раза для следующего (64 детей)
  • 3 раза для следующего (128 детей)
  • 2 раза в течение следующего (256 дети)
  • 1 раз за последний (512 детей)

Итого: 10 * 2 + 9 * 2 + 8 * 4 + 7 * 8 + 6 * 16 ± 5 * 32 + 4 * 64 + 3 * 128 + 2 * 256 + 1 * 512 = 2046.

printf() Выполняется 2046 раз.

+0

Спасибо за объяснение. Это ясное сомнение. Я хотел бы изменить программу выше, чтобы отобразить сообщение о том, что это либо родительский процесс, либо дочерний процесс, возможно ли это? –

+0

'fork()' возвращает 0 дочернему элементу, а число больше нуля для родителя, если вызов был успешным. Таким образом, вы можете сделать, например, «i = fork();», а затем «if (i == 0) printf (« Я - ребенок. \ N »);' –

+0

Большое вам спасибо! –

0

проверить мой Exemple

pid_t pID = fork(); 
     if (pID == 0)    // child 
     { 
      // Code only executed by child process 

      sIdentifier = "Child Process: "; 
      globalVariable++; 
      iStackVariable++; 
    } 
     else if (pID < 0)   // failed to fork 
     { 
      cerr << "Failed to fork" << endl; 
      exit(1); 
      // Throw exception 
     } 
     else         // parent 
     { 
      // Code only executed by parent process 

      sIdentifier = "Parent Process:"; 
     } 

     // Code executed by both parent and child. 
Смежные вопросы