Использование трубы внутри петли - PullRequest
0 голосов
/ 28 декабря 2011

Я создал функцию сокета, чтобы запустить процесс, заполнить его данными и получить возврат

void runAndPrint()
{
    int fd[2], fout[2], num_bytes;
    int pid;
    char c, buf[10], buffer[100];
    FILE *fp;

    pipe(fd);
    if((pid = fork()) == -1)
        return 1;

    if (pid == 0)  
    {  
        while ((num_bytes = read(fileno(stdin), buffer, 1)) > 0){
            write(fd[1], buffer, num_bytes);            
        }
        printf("parent");
    }
    else
    {
        printf("child");
        close(fd[1]);
        dup2(fd[0], 0);
        close(fd[0]);

        pipe(fout);
        if((pid = fork()) == -1)
            return 1;

        if (pid == 0)  
        {
            close(fout[0]);
            dup2(fout[1], 1);
            close(fout[1]);
            execlp("base64", "base64", NULL);
        } 
        else
        {
            close(fout[1]);
            while((c = read(fout[0], buf, 10)) > 0)
            {
                printf("--- %.*s", c, buf);
            }
        }
    }

    return 0;
}

и мне нужно выполнить его на сокете ....

Где я делаю, пока читаю .. пишу в фд [1] Я отправлю данные полученные из сокета. Данные, обработанные в процессе LOL я отправлю обратно в сокет.

Моя проблема:

int main(){
    try{ 
        TCPServerSocket servSock(echoServPort);
        for(;;){
            runAndPrint();
            HandleTCPClient(servSock.accept());
        }
    }
}

Это всего лишь пример.

Но в цикле печатается только родительская часть, а не дочерняя, только потому, что она находится в цикле. Я не знаю, как продолжать процесс runAndPrint, пока не обработан дочерний процесс.

...