2016-12-13 1 views
-1

Так что мне нужна эта программа, которая должна создать дочерний элемент argv [1] с использованием fork() и напечатать, какой номер у них есть и какой PID у них есть в порядке его создания.C пика и трубы для печати pid в порядке

Я должен сделать это, используя свойства блокировки труб.

Пример вывода:

Я ребенок 1 и мой ПИД 25853.

Я ребенок 2 и мой ПИД 25854.

Я ребенок 3 и мой ПИД 25855.

Это то, что я пробовал до сих пор, но не соблюдает порядок создания детей.

int main(int argc, char* argv[]) 
{ 
    char buffer[80]; 
    int p[2], i; 
    int pid = getpid(); 
    for (i = 0; i < atoi(argv[1]); i++) { 
     pipe(p); 
     if (fork() == 0) { 
      read(p[0], &pid, sizeof(pid)); // It should block here until there's 
      // something in the pipe to read 
      sprintf(buffer, "I am child %d and my PID is %d\n", i + 1, getpid()); 
      write(1, &buffer, strlen(buffer)); 
      close(p[0]); 
      close(p[1]); 
      exit(0); 
     } 
     else { // parent 
      close(p[0]); 
      write(p[1], &pid, sizeof(pid)); 
      close(p[1]); // The child is able to read the EOF now. 
     } 
    } 
    while ((waitpid(-1, NULL, 0)) > 0) 
     ; 
    close(p[0]); 
    close(p[1]); 
    sprintf(buffer, "I've finished\n"); 
    write(1, &buffer, strlen(buffer)); 
} 

Я чувствую, что я близок, но я не правильно использую каналы каналов. Мне нужен совет, спасибо.

+2

Ребенок работает * одновременно с родителем. В частности, ваш родитель не дожидается завершения до того, как будет обработан дочерний файл 'fork(), поэтому порядок, в котором дети печатают на консоль, не является детерминированным. Вы должны 'wait()' * внутри * '' for() '-loop в родительском. – EOF

+0

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

+0

@EOF, поэтому я не могу использовать wait на каждом цикле, или он не будет одновременным. –

ответ

0
#include <sys/types.h> 
#include <sys/wait.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <stdio.h> 

int main(int argc, char* argv[]) 
{ 
    if (argc != 2) { 
     return 1; 
    } 
    int const n = atoi(argv[1]); 
    for (int i = 0; i < n; i++) { 
     int p[2]; 
     if (pipe(p) != 0) 
      return 1; 
     int pid = fork(); 
     if (pid == 0) { 
      close(p[1]); 
      if (read(p[0], &pid, sizeof pid) != sizeof pid) 
       return 1; 
      close(p[0]); 
      fprintf(stdout, "I am child %d and my PID is %d\n", i + 1, pid); 
      return 0; 
     } 
     else if (pid > 0) { 
      close(p[0]); 
      if (write(p[1], &pid, sizeof pid) != sizeof pid) 
       return 1; 
      close(p[1]); 
      if (waitpid(pid, NULL, 0) == -1) 
       return 1; 
     } 
     else { 
      return 1; 
     } 
    } 

    fprintf(stdout, "I've finished\n"); 
} 
Смежные вопросы