2014-01-12 3 views
0
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 

int main(int argc, char* argv[]) 
{ 
    int i; 

    int fd[2]; 
    int values[argc - 1]; 


    for(i = 1; i < argc; i++) { 
     pipe(fd); 

     switch(fork()) { 
     case 0: /* child */ 
     /* Do stuff */ 
     close(fd[0]); 
     int value = atoi(argv[i]); 
     write(fd[1], &value, sizeof(value)); 
     exit(0); 
     case -1: 
     perror("fork"); 
     exit(1); 
     default: /* parent */ 
     close(fd[1]); 
     read(fd[0], &values[i - 1], sizeof(values[i - 1])); 
     /* do stuff, but don't wait() or terminate */ 
     } 
    } 

    for (i = 0; i < (argc - 1); i++) 
    { 
     printf("%d\n", values[i]); 
    } 

    return 0; 
} 

im пытается создать столько процессов, сколько количества аргументов, предоставленных исполняемому файлу, и каждый из них обрабатывает аргумент родительскому объекту и сохраняет в массиве и в конце распечатывает элементы массива. поскольку процессы выполняются параллельно, когда я распечатываю элементы массива, порядок должен быть случайным по отношению к порядку, в который я ввел эти элементы, но это, похоже, не так, поскольку я выполнил исполняемый файл 1 миллион раз, может кто-то скажите мне, в чем проблема? Итак, кто-то любезно отметил, что чтение сериализует вещи, что я должен сделать, чтобы процессы были действительно параллельными?c параллельные процессы, связанные с трубой

ответ

0

Ваша труба read в родительской сериализации вещей.

Вы (1) создаете ребенка; (2) ребенок пишет в трубу; (3) родитель будет блокировать на read, пока не появится что-то прочитать. Это повторяется для всех детей.

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