Używanie potoku do przekazywania wartości całkowitych między rodzicem a dzieckiem
Jestem trochę zdezorientowany, jak poprawnie używać pipe () do przekazywania wartości całkowitych między dwoma procesami.
W moim programie najpierw tworzę fajkę, a potem ją rozwidlam. Zakładam, że mam wtedy „dwie” rury?
Z tego, co rozumiem, to jest moje zadanie. Mój rodzic przechodzi przez pętlę for, sprawdzając wartość całkowitą „i” dla pewnej operacji, zwiększa zmienną licznika i zapisuje wartość w tablicy. Po każdym sprawdzeniu mój rodzic powinien przekazać wartość całkowitą „i” mojemu dziecku przez potok. Moje dziecko używa wtedy tej wartości całkowitej, sprawdza wartość i powinno zwiększyć zmienną licznika i zapisać wynik w tablicy [udostępnione?]. Ostatecznie; dziecko powinno zwrócić jego ostateczną liczbę rodzicowi, który następnie wypisuje dwie liczby i tablicę „Udostępnione”.
-> Nie jestem pewien, czy muszę mieć wspólną tablicę lub w ogóle zapisać wyniki. Mogę tylko liczyć - praca domowa była niejednoznaczna i czekam na odpowiedź profesora. Również; czy mogę wykonać wspólną tablicę między procesami? To brzmi jak początek jakiegoś problemu dla mnie.
-> Oto moje pytania: Jeden; jak używać potoków dla liczb całkowitych? Widziałem je tylko dla tablic znaków, a poprzednie odpowiedzi nie wydają się uważać, że jest to możliwe lub legalne ..? Nie jestem pewny. Nie mogłem znaleźć na nim żadnej rozdzielczości.
-> Jak używać jednokierunkowej rury do przekazywania liczb całkowitych dziecku? I czy dziecko coś zwraca? Nie jestem pewien, jak jestem w stanie ... rozróżnić dwie rury. „Wiem” [lub myślę, że wiem], że muszę zamknąć jedną nieużywaną część każdej rury, aby uniknąć „jakiegoś niejasnego problemu”.
Przepraszam za głupie pytania; Jeszcze nie uczono mnie procesów (poza widelcem) ani rur (w ogóle) w tej klasie - więc nie jestem pewien, od czego zacząć!
Oto części mojego kodu - nie jest ładny i nie działa i nie oczekuję tego. To bardziej element zastępczy powłoki. Kiedyś wymyślę, jak używać fajki - Prawdopodobnie sprawię, że kod będzie miał sens.
int main(void)
{
int fd[2];
pid_t childpid;
pid_t parentpid;
int i;
int threecount = 0;
int fivecount = 0;;
int results [MAXSIZE];
parentpid = getpid(); //Get current process ID number
pipe(fd);
childpid = fork();
if(childpid == 0){
close(fd[0]); //Closing this for some other reason
}
int j = 0;
if(childpid > 0)
close(fd[1]); //Closing this for some reason
if( childpid == -1 )
{
perror("Failed to fork\n");
return 1;
}
if (childpid > 0)
{
for(i = 1; i < MAXSIZE;i++)
{
if(i % 5 == 0)
{
fivecount++;
i = results[j];
j++;
wait(NULL);
}
}
}
else if (childpid == 0)
{
if(i % 3 == 0) //This i here should probably be the i value above, piped to the child
{
threecount++;
i = results[j]; //This should be part of th pipe
j++; //Trying to keep count of that shared array, not really the right way to do it though.
}
}
printf("%d %d \n", fivecount,threecount);
return 0;
}