Когда эта программа запускается, она проходит через цикл в родительском элементе, а затем переключается на дочерний элемент при записи в канал. У ребенка трубка, которая читает, заставляет программу останавливаться.Почему этот код перестает работать, когда он попадает в трубу?
Текущий пример вывода:
Родитель 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]);
}
}
Программа заканчивается, когда он попадает в читать из линии трубопровода у ребенка.
Я чувствую запах os161 и назначение ОС – Steve