2012-06-07 1 views
1

На курсе учитель дал нам некоторый код (на доске), но у него ужасное письмо, и я не могу сделать несколько частей. Также новый как на трубе, так и на вилке, так что это не помогает.Проблемы с трубой/вилкой. Не могу понять половину руководства (человек)

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
void main() { 
    int a[] = {1,2,3,4}, f[2]; // ok so we initialize an array and a "pipe folder" (pipefd in manual) ? 
    pipe (f);     // not 100% sure what this does ? 
    if (fork() == 0) {   // if child 
     close (f[0]);    // close pipe read-end 
     a[0] += a[1];    
     write (f[1], &a[0], sizeof (int))  // fixed 
     close (f[1]);    // close pipe write-end 
     exit(0);     // closes child and sends status update to parent ? 
    } 
    else {       // if parent 
     close (f[1])    // close write-end of pipe 
     a[2]+=a[3]; 
     read (f[0], &a, sizeof(int))   // fixed 
     wait (0);     // waits for child to ... close ? or just finish ? or is it the same thing 
     a[0]+= a[2]; close (f[0]); 
     printf ("%d\n, "a[0]); 
    } 
} 

Выполняется ли ребенок и родители в определенном порядке. Я предполагаю, что родитель ждет, когда ребенок закроется, если close (f[1]) не возвращает ошибку, это продолжается? (Кстати, что означает «0» в wait(0)) и только потом продолжается?

Что я не понимаю? я получаю что-то правильно?

Я думал, что должен упомянуть, что я провел некоторое исследование, используя man, но я нахожу его чрезвычайно запутанным. Насколько я знаю они предназначены для пользователей, которые уже знают, что они делают, но забыли некоторые детали (например, что включать и что делать -p) или люди, которые имеют более чем базовое понимание.

+0

Это помогает, если вы не удаляете вопросы, а затем отправляете слегка измененную версию. –

+0

'pipefd' означает дескриптор файла pipe – lvella

+0

Я предполагаю, что этот пример показывает, как можно вычислить сумму на 2 параллельных процесса: одна сумма составляет половину чисел, а другая суммирует вторую половину и получает ответ от другого процесса. Поэтому число '8', вероятно, означает« 2 целых числа, по 4 байта каждый » – anatolyg

ответ

5
  1. pipe создает два дескриптора файла. Один, на который вы пишете, и другой, с которым вы читаете. То, что вы пишете в одном, вы можете читать с другого. Файловые дескрипторы в UNIX являются целыми числами (int).
  2. Дескрипторы файлов наследуются дочерними процессами. Следовательно, труба позволяет обмениваться данными между процессами. В этом случае ребенок записывает некоторые данные, которые родитель может затем прочитать.
  3. Вместо использования 8 в описании для чтения/записи используйте sizeof, т. Е. sizeof(int). Компиляция даст правильное значение для количества сохраняемых байтов и int
  4. wait(0) ждет, пока ребенок закончит работу.
Смежные вопросы