2014-10-08 2 views
0

Когда эта программа запускается, она проходит через цикл в родительском элементе, а затем переключается на дочерний элемент при записи в канал. У ребенка трубка, которая читает, заставляет программу останавливаться.Почему этот код перестает работать, когда он попадает в трубу?

Текущий пример вывода:

Родитель 4741 14087 (только эта линия, когда больше 5 строк, как ожидается)

Ожидаемые результаты (со случайно генерируемых чисел):

Родитель 4741 14087

Детей 4740 47082

Родитель 4741 11345

Ребенок 4740 99017

Родитель 4741 96744

Ребенок 4740 98653 (при введении переменной 3 и последнее число случайно сгенерированное число)

#include <stdio.h> 
#include <iostream> 
#include <unistd.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <time.h> 
#include <ctime> 
using namespace std; 

int main (int argc, char *argv[]) { 
    int pid = fork(), temp, randNum, count, pipeName[2], pipeName2[2]; 
    string conver; 
    pipe(pipeName); 
    conver = argv[1]; 
    temp = atoi(conver.c_str()); 
    char letter; 


    if (pid == 0) { //child 
     srand((unsigned)time(NULL) * getpid()); 
     //closing unused pipes 
     close(pipeName2[1]); 
     close(pipeName[0]); 
     //loop to switch between processes 
     for(int i=0; i<temp; i++) { 
      count = read(pipeName2[0], &letter, 20); 
      randNum = rand(); 
      cout << "Child " << getpid() << " " << randNum << endl; 
      write(pipeName[1], "x", 1); 
     } 
     close(pipeName2[0]); 
     close(pipeName[1]); 
    } 
    else { //parent 
     srand((unsigned)time(NULL) * getpid()); 
     pipe(pipeName2); 
     //closing unused pipes 
     close(pipeName2[0]); 
     close(pipeName[1]); 
     //loop to switch between processes 
     for(int i=0; i<temp; i++) { 
      if(i != 0) 
       count = read(pipeName[0], &letter, 20); 
      randNum = rand(); 
      cout << "Parent " << getpid() << " " << randNum << endl; 
      write(pipeName2[1], "x", 1); 
     } 
     close(pipeName[0]); 
     close(pipeName2[1]); 
    } 
} 

Программа заканчивается, когда он попадает в читать из линии трубопровода у ребенка.

+1

Я чувствую запах os161 и назначение ОС – Steve

ответ

1

Ваша основная ошибка: fork() ing перед инициализацией труб. Таким образом, у родителя и ребенка есть своя приватная (не разделенная через fd наследование) пара пачек с именем pipeName, и только родительский инициализирует pipeName2 с использованием fds.

Для родителя просто нет данных для чтения за pipeName[0]. Для ребенка ... кто знает, что fd пишет в pipeName2[1]? Если вам повезет, что не удается с EBADF.

Итак, сначала pipe() дважды, и затемfork(), и посмотрите, улучшает ли это ситуацию.

+0

Исправлена ​​ошибка, но теперь она переходит к оператору записи, а затем программа заканчивается снова. Есть идеи для этого? – Dean

+0

@Dean, трудно сказать без другого вопроса с демонстрационным кодом. С манжетой мне было бы интересно, если вы рухнете, потому что вы пытаетесь 'read()' 20 байтов в один буфер символов ... – pilcrow

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