2016-02-10 5 views
0

У меня есть следующий код:C Параллельные процессы и трубы

for(i=0; i < argc; i++) 
{ 
    pipe(fd[2]); 
    pid=fork(); 

    if (pid > 0) 
    { 
      close(fd[1]); 
      // read the string, and print it 
    } 
    else if (pid == 0) 
    { 
      close(fd[0]); 
      // write the file name to the main process 
      break; 
    }  
} 

// wait for all processes to finish 

Так в основном, это выводит имя каждого файла в последовательном порядке:

file1 
file2 
file3 

Но если я ставлю printf("%d\n", getpid()) после того, как цикл , выходы кажутся параллельными. Сначала обрабатываются некоторые процессы с более высоким идентификатором процесса.

Вопрос в том, как я могу читать или записывать трубу внутри цикла for, является ли она последовательной или параллельной?

+1

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

+0

Кажется, что это будет последовательным из-за того, что родительский процесс читает из канала и который читает блоки, пока ребенок не напишет на него. Это также означает, что родитель не будет делать следующую 'fork', пока каждый ребенок, который был только разветвлен, не выполнил свою запись. Это предполагает, что каждое 'чтение' потребляет все, что было написано, что на самом деле не гарантируется. – kaylum

+0

путь «child» должен заканчиваться вызовом 'exit()', а не просто выходить из цикла. – user3629249

ответ

1

печать после цикла for() значение, возвращаемое с getpid(), будет напечатано как для дочерних элементов (много), так и для родительского pid.

Нет гарантий относительно того, какой процесс будет выполняться до звонка до printf().

поэтому значения pid могут (и, как вы видели), вероятно, будут напечатаны в некотором «случайном порядке».

1

Когда вы переставляете дочерний процесс, родительский и дочерний одновременно запускаются одновременно. Если они не выполняют что-то, что их синхронизирует, порядок, который они выполняют каждый, непредсказуем.

В случае Вашего for цикла, считывает и записывает в трубах синхронизации процессов: родитель не может вернуться из read() только после того, как ребенок называется write(). И они не откажут от новых детей, пока оба не сделают этого.

Но после того, как цикл завершен, синхронизация процессов не происходит, поэтому все они будут печатать свои PID в любом порядке.

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