Jak zaimplementować potoki dla wielu procesów?


Tworzę wiele procesów i

Muszę utworzyć dwie nienazwane potoki dla każdego procesu.

Dla każdego dziecka zostanie użyty jeden kanał, aby uzyskać wartość int od rodzica; jednym z nich jest wysyłanie tablic int do rodzica. Rodzic zrobi kilka rzeczy

,

otrzymywanie nowych danych od dziecka.
Kod podstawowy:
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>// for reaching unix operations
int main(int argc, char *argv[]){
pid_t main = getpid(); int N = 30;
int i;
pid_t* children = (pid_t*) malloc(sizeof(pid_t) * N);
for(i = 0; i < N; i++){
pid_t child = fork();
if ( child == 0){
pid_t me = getpid();
printf("I'm a child and my pid is: %d\n", me);
sleep(1);
// exit(4);
return me * 2;
} else if ( child < 0){
// printf("Could not create child\n");
} else {
children[i] = child;
// printf("I have created a child and its pid %d\n", child);
}
}// The child never reaches here
for(i = 0; i < N; i++){
int status;
waitpid(children[i], &status, 0);
printf("Process %d exited with return code %d\n", children[i], WEXITSTATUS(status));
}
return 0;
}

Próbowałem wielu rzeczy, ale bezskutecznie i zgubiłem się. Czy możesz mi pomóc kontynuować?
Każda pomoc jest mile widziana! Podziękować.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Oto jak skonfigurować jeden potok dla każdego procesu podrzędnego, aby każdy proces podrzędny zapisywał dane do elementu nadrzędnego:
Ponieważ potrzebujesz dwóch deskryptorów plików dla każdego dziecka, zadeklaruj:
int fd[2 * N];

Zainicjuj je odpowiednio:
for (int i = 0; i < N; i++) {
pipe(&fd[2*i]);
}

Wewnątrz procesu potomnego
i
użyj:
write(fd[2*i + 1], write_buffer, SIZE)

napisz do rodzica, a do rodzica:
read(fd[2*i], read_buffer, SIZE)

czytaj z
i
th dziecka.
Aby zamknąć rury:
Wewnątrz
i
th dziecka możesz użyć
close(fd[2*i])

od razu, bo tylko piszesz. Po zakończeniu pisania zadzwoń
close(fd[2*i + 1])

aby zamknąć koniec nagrania potoku.
Sytuacja jest równoległa z rodzicem: czytając od
i
dziecka, możesz
close(fd[2*i + 1])

od razu, skoro nie piszesz, a po przeczytaniu zadzwoń
close(fd[2*i])

aby zamknąć czytelny koniec rury.
Ponieważ potrzebujesz

dwa

potoki dla każdego procesu potomnego, utwórz dwie tablice - jedną zawierającą potoki dla procesów potomnych zapisujących się do rodzica i jedną zawierającą potoki dla procesów nadrzędnych zapisujących się do dzieci.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się