2015-09-28 2 views
0

Попытка написать простую программу, которая использует pipe/fork для создания/управления 1 родительским и 4-мя процессами. Предполагается, что родительский процесс отобразит главное меню.Настройка четырех процессов с помощью fork() с использованием 1 трубы

Main Menu: 
1. Display children states 
2. Kill a child 
3. Signal a child 
4. Reap a child 
5. Kill and reap all children 

Код, который я пишу сейчас, должен создать 4 дочерних процесса. Я не уверен, правильно ли я настроил четыре дочерних процесса. Я понимаю, что fork возвращает 0 ребенку и PID родительскому. Как получить доступ к родительскому элементу для этих значений PID? Где именно я настраиваю меню для родительского процесса?

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

#define BUFSIZE 1024 
#define KIDS 4 
main() 
{ 
    //create unnamed pipe 
    int fd[2]; 
    char buf[BUFSIZE]; 

    if (pipe(fd) < 0) 
    { 
     perror("pipe failed"); 
     exit (1); 
    } 

    //array of child pids 
    size_t child_pid[4]; 

    //create 4 proccesses 
    int i = 0; 
    for (i = 0; i < KIDS; i++) { 
     child_pid[i] = fork(); 
     if (child_pid[i]) { 
      continue; 
     } else if (child_pid[i] == 0) { 
      close(fd[0]); 
      printf("Child %d: pid: %zu", i+1, child_pid[i]); 
      break; 
     } else { 
      printf("fork error\n"); 
      exit(1); 
     } 

    } 

} 

Мой вывод:

Child 1: pid: 0 
Child 2: pid: 0 
Child 3: pid: 0 
Child 4: pid: 0 
+0

Возможно, вы имели в виду ошибку? Сколько раз это цикл? и где это объявлено «pid»? – artsylar

+1

Извините, что я менялся вокруг этой петли так, что я испортил это, это должно быть child_pid [i]. Я редактирую вывод, который я получаю. – tdwig

+0

'printf (« Child% d: pid:% zu », i + 1, child_pid [i]);' работает отлично. Он выполняется только тогда, когда 'child_pid [i] == 0', и это именно то, что он делает (т. Е. Печатает нуль). Ошибка в вашей концепции. – sokin

ответ

0

Я уверен, если я устанавливаю до четырех дочерних процессов правильно.

Право, вы не должны позволять детям вырваться из блока кода, поэтому изменить

  break; 

в

  sleep(99); // or whatever you want the child to do 
      exit(0); 

Как получить доступ к родителю ...?

getppid(), если по какой-то причине вам это необходимо.

Где именно я настраиваю меню для родительского процесса?

ли, что после for петли до конца main, что, где родитель продолжает выполнение.

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