2013-09-23 5 views
0

У меня есть следующий код, в котором я пытаюсь создать подпроцессы путем форкирования. Я хочу, чтобы выполнялось ровно 3 подпроцесса. Однако, когда я запускаю код, я, кажется, получаю больше, возможно, из-за того, что дети обрабатывают внуков. Что мне здесь не хватает, как я могу это предотвратить.Предотвращение больших детей от разветвления в C

Код:

for(j = 0; j < 3 ; j++){ 
    if((pid = fork()) == 0){   // child process 
     dosomething(); 
     exit(0);    // terminate child process 
    } 
    else if((pid = fork()) > 0){ 
     printf("I'm in parent of the client spawn loop\n"); 
//  exit(0);  
    } 
} 

Выход:

I'm in parent of the client spawn loop 
I'm in parent of the client spawn loop 
I'm in parent of the client spawn loop 
I'm in parent of the client spawn loop 
I'm in parent of the client spawn loop 
I'm in parent of the client spawn loop 
I'm in parent of the client spawn loop 
+3

Вы вызываете fork дважды. –

+0

Да, понял! это было небрежно с моей стороны! грубый случай копирования вставки –

ответ

5

Не делайте второй fork вызова, как это создаст новый ребенок. Первый достаточно:

for (j = 0; j < 3; ++j) 
{ 
    pid_t pid = fork(); 
    if (pid == 0) 
    { 
     printf("In child (j = %d)\n", j); 
     exit(0); 
    } 
    else if (pid > 0) 
    { 
     printf("In parent (j = %d)\n", j); 
    } 
} 

"In child" Напечатает три раза, с j равным 0, 1 и 2. То же самое для родительской печати.

В вашем реальном коде вы должны проверить наличие ошибок.

+0

О, черт побери, мой плохой! –

1

Не называйте более fork(), чем один раз в цикле.

Родитель не должен снова звонить fork(), который создаст еще одного дочернего элемента и представит другую точку разделения родителя-родителя.

Вы должны иметь в цикле:

const int pid = fork(); 
if(pid == 0) 
{ 
    doSomething(); 
    exit(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^