2015-11-05 3 views
-1

У меня есть родительский процесс, из которого я хочу создать 4 дочерних процесса, а 2 из дочерних процессов - по одному дочернему процессу.Родительский процесс имеет несколько дочерних процессов и дочерний процесс имеет дочерний процесс

Мне удалось создать 4 дочерних процесса от родителя. Но когда я пытаюсь создать дочерние процессы для 2 дочерних процессов, у меня есть бесконечный цикл. Я использовал цикл для создания 4 процессов и добавил условие, когда создается второй дочерний процесс и четвертый дочерний процесс, создайте дочерний процесс для каждого из них.

  • Родитель имеет (child1 chil2 child3 ребенка 4)
  • Child2 имеет (ребенок 5 ребенка6)

Источник:

#include <stdio.h> 
#include <unistd.h> 
#include <sched.h> 
#include <sys/time.h> 
#include <sys/resource.h> 

int main(int argc, char **argv) 
{ 
    int i; 
    for(i = 0; i <= 3; i++) 
    { 
     if(fork() == 0) 
     { 
      printf("process %d and his parent is %d \n", 
       getpid(), getppid()); 

      if(i = 1) 
      { 
       if(fork() == 0) 
       { 
        printf("process %d and his parent is %d \n", 
         getpid(), getppid()); 
        break; 
       } 
      } 
     } 
    } 

    return 0; 
} 
+5

Опубликовать минимальный код. Не могу понять, что вы сделали неправильно. –

+0

#include #include #include #include #include INT основных (INT ARGC, символ ** ARGV) { INT I; для (i = 0; i <= 3; i ++) { if (fork() == 0) { printf ("процесс% d и его родительский элемент% d \ n", getpid(), getppid()); \t \t, если (I = 1) { \t \t \t, если (вилка() == 0) { \t \t \t Е ("Процесс% d и его родитель% d \ п", GETPID(), getppid ()); \t \t \t \t break; \t \t \t} \t \t \t}} } возврата 0; } – Kazaloco

+0

Система работает! Теперь у вас уже два раза возобновляются голоса, когда вы разместили код. В комментарии не менее :) –

ответ

0

два вопроса. Во-первых:

if(i = 1) 

Вы используете =, которое присваивание вместо ==, который сравнивает равенства. Что на самом деле происходит здесь, так это то, что i присваивается значение 1, и это значение (1) оценивается в булевом контексте, что всегда верно. Поэтому каждый ребенок входит в блок if и разворачивает собственный ребенок.

Используйте оператор Comparision вместо этого, а также проверить, если i либо 1 или 3, если вы хотите, второй и четвертый дети также fork:

if ((i == 1) || (i == 3)) 

Во-вторых, в конце if(fork()==0) блока, дочерний процесс продолжается для следующей итерации цикла for. Таким образом, каждый ребенок будет ссылаться на родительское поведение цикла и разветвления. Это приводит к созданию большего количества процессов, чем ожидалось.

Вам необходимо добавить инструкцию exit в конце этого блока. Кроме того, убедитесь, что #include <stdlib.h> для определения exit:

if (fork()==0) 
{ 
    ... 
    exit(0); 
} 

Еще одна вещь, которая была бы полезна: В конце цикла, имеют родителя wait для всех детей, чтобы закончить. В противном случае, он может exit, прежде чем его дети и дети будут сообщать процесс `как родитель

Таким образом, после этих исправлений, код выглядит следующим образом:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sched.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <sys/time.h> 
#include <sys/resource.h> 

int main(int argc, char **argv) 
{ 
    int i; 
    for(i = 0; i <= 3; i++) 
    { 
     if(fork() == 0) 
     { 
      printf("process %d and his parent is %d \n", 
       getpid(), getppid()); 

      if ((i == 1) || (i == 3)) 
      { 
       if(fork() == 0) 
       { 
        printf("process %d and his parent is %d \n", 
         getpid(), getppid()); 
        exit(0); 
       } 
       while (wait(NULL) != -1); 
      } 
      exit(0); 
     } 
    } 
    while (wait(NULL) != -1); 

    return 0; 
} 
0

Вы присваиваете значение 1 i вместо сравнения ,

if(i = 1) 

должен быть

if(i == 1) 

если вы намеревались проверить равенство i и значение 1. Присваивание переменной управления цикла создает бесконечный цикл, когда i всегда устанавливается в значение 1.

Однако, на основе вашего описания, в котором говорится, что вы хотите создать дочерний процесс для второго и четвертого из 4 начальных дочерних процессов, это еще не выполнило то, что вам нужно.

Учитывая ограничения 4 оригинальных детей, вы можете написать

if((i & 1) != 0) 

, которое приводится к true для значений 1 и 3, где младший бит двоичного представления i устанавливаются.

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