2016-03-06 7 views
1

Я пытаюсь сделать это, у меня есть родительский и дочерний процесс. Я пытаюсь прочитать файл и передать весь контент ребенку. Входной файл содержит записи. Я должен читать один раз за раз и переходить к ребенку. Но что бы я ни делал. ребенок читает только первую запись, а не все остальные. Я тестировал свой метод, получая все записи из входного файла, но не могу записать их все для ребенка. Любая идея, пожалуйста.Как передать несколько записей ребенку из родителя с помощью fork

struct product_record { 
    int idnumber;   // Unique identification 
    char name[PRODUCTSIZE]; // String description 
    double price;   // Unit cost 
}; 

int pid, mypipe[2], status; 

int main(int argc, char **argv) 
{ 
    int result;  
    result = pipe(mypipe);//create pipes  
    if (result < 0) { 
     perror("pipe creation error");//failure in creating a pipe 
     exit (1);  
    }//if 

    if ((pid = fork()) == 0) 
    { 
     read(mypipe[0], &product, sizeof(product)); 
     exit(0); 
    } 
    else if (pid == -1) 
    { 
     cout << "Fork failed" << endl; 
     exit(1); 
    } 
    else 
    {//parent 
     parentReadsFromTheFile(argv);//argv inputfile name 
     wait(&status); 
    } 
    return 0;//Return to the OS. 
}//main 

void parentReadsFromTheFile(char **args) 
{ 
    while (getline(inputFile, line)) //read a line till EOF 
    { 
     //put read record into product 
     write(mypipe[1], &product, sizeof(product));//Write to pipe 
    } 
} 
+0

Совместите ваш код правильно и не комментировать очевидное. – chqrlie

+0

Опубликовать определение 'product'. – chqrlie

+0

Я отредактировал и объяснил лучше. Благодарю. – user2934615

ответ

1

Вы можете передавать данные через трубу от процесса к другому, но эти данные должны содержать только скалярную информацию, вы не можете передавать адреса или указатели таким образом.

Я подозреваю, что ваш объект product не является простой структурой с просто цифрами и символами.

С таким типом вы отправили сообщение для product, этот тип может быть передан таким образом.

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

if ((pid = fork()) == 0) { 
    read(mypipe[0], &product, sizeof(product)); 
    exit(0); 
} 

Ваш записи: независимо от того, что я делаю. ребенок читает только первую запись, а не все остальные., но это именно то, что вы делаете!

На самом деле, имейте в виду, что read может возвращать короткий счет в некоторых условиях, которые вы должны поддерживать, но в текущем случае вы пытаетесь прочитать только одну структуру и выйти из процесса. Дальнейшая запись родителем на трубку не удастся.

0

Причина ваш «ребенок читает только первую запись, а не все остальные», потому что вы exit() сразу после прочтения сразу:

if ((pid = fork()) == 0) 
{ 
    read(mypipe[0], &product, sizeof(product)); 
    exit(0); 
} 
+0

" - это потому, что вы выходите() сразу после чтения один раз: «Я удалил выход. Все еще не получилось/ – user2934615

+0

@ user2934615: Удаление 'exit()' явно недостаточно. Вам придется написать код, который заставляет его читать остальную часть записей, он не будет делать это сам по себе ... –

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