Mam napisać serwer który obsługuje 2 polecenia
quit - kończy połączenie
get - wysyła klientowi wynik wykonania programu /usr/bin/top

Wszystko działa dobrze tyle że polecenie get działa tylko raz, za każdym następnym razem program top się wykonuje prawidłowo ale dane nie są wysyłane do właściwego strumienia. Podejrzewam że coś pomieszałem z deskryptorami.
Proszę o pomoc :D

Oto kod funkcji obslugującej połączenie z klientem:

int ProcessConnection(int ChildSocket)
{
    int CommandId;          //Identyfikator komendy do wykonania
    int TopPid;             //Id procesu programu top

    //Wiadomosci jakie moga byc wyslane do klienta
    char *Prompt = "> ";
    char *InvalidCommand = "> Invalid command, try again\n";

    while (1)
    {
        //Wyslij znak zachety
        if ((SendData(ChildSocket, Prompt)) < 0)
        {
            return -1;
        }

        //Odbirz id komendy podanej przez klienta
        if ((CommandId = LoadCommand(ChildSocket)) < 0)
        {
            return -1;
        }

        //Obsluguj podana komende
        switch (CommandId)
        {
            //Obsluga komendy quit
            case 1 :    return 0;
                        break;

            //Obsluga komendy get
            case 2 :    if(pipe(Descriptors) < 0)
                        {
                            return -1;
                        }

                        //Tworzenie nowego procesu dla programu top
                        if ((TopPid = fork()) < 0)
                        {
                            close(Descriptors[0]);
                            close(Descriptors[1]);
                            return -1;
                        }

                        //Kod do wykonania w procesie potomnym
                        if (TopPid == 0)
                        {
                            const char *Path = "/usr/bin/top";      //Program do wykonania
                            char *const Arguments[] =               //Argumenty wywolania programu
                            {
                                "/usr/bin/top",
                                "-b",
                                "-n",
                                "1",
                                NULL
                            };

                            //Zamknij deskryptor i podmien wyjscie
                            close(Descriptors[0]);
                            dup2(Descriptors[1], 1);

                            //Podmien kod procesu
                            if(execv(Path, Arguments) < 0)
                            {
                                close(Descriptors[1]);
                                exit(errno);
                            }
                        }

                        //Kod do wykonania w procesie macierzystym
                        else
                        {
                            int BuffLen = 100;      //Dlugosc bufora odczytu
                            char Buff[BuffLen];     //Buforek
                            int BytesReceived;      //Ilosc odebranych bajtow

                            close(Descriptors[1]);

                            while (BytesReceived != 0)
                            {
                                //Wyzeroj buforek
                                bzero(Buff,sizeof(Buff));

                                //Czytaj z lacza
                                if ((BytesReceived = read(Descriptors[0], Buff,BuffLen)) < 0)
                                {
                                    wait(0);
                                    close(Descriptors[0]);
                                    return -1;
                                }

                                //Wyslij odczytane dane do klienta
                                if ((SendData(ChildSocket, Buff)) < 0)
                                {
                                    wait(0);
                                    close(Descriptors[0]);
                                    return -1;
                                }
                            }

                            //Czekaj na zamkniecie procesu potomnego
                            wait(0);
                            close(Descriptors[0]);
                        }
                        break;

            //Obsluga blenych komend
            case 0 :    if ((SendData(ChildSocket, InvalidCommand)) < 0)
                        {
                            return -1;
                        }
                        break;
        }
    }
    return 0;
}