Как мне прочитать из канала, не зная, сколько данных будет отправлено через канал? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь передать вывод вызова excv через канал, прочитать его, а затем выполнить еще один вызов execv.Пример: ls -l |Больше.Я не уверен, как читать данные, поступающие через канал.Я попытался найти хороший ответ о том, как сделать это с другими ресурсами, но все используют очень простые примеры со строкой фиксированного размера.Нужно ли делать чтение данных динамически, допуская более или менее, или это может быть буфер фиксированного размера?

else {
    int pipefd[2];
    pipe(pipefd);

    int rc = fork();
    if(rc == -1) {
       error();
    }
    if (rc == 0) {

    // close reading end in the child
    close(pipefd[0]);

    // send stdout to the pipe
    if(dup2(pipefd[1], 1) == -1) {
            error();
    }

    // send stderr to the pipe
    if(dup2(pipefd[1], 2) == -1) {
            error();
    }

    // this descriptor is no longer needed
            close(pipefd[1]);

    // example 
    // path: /bin/ls
    // commands: ls -l
    if (access(path, X_OK) == 0) {
           execv(path, commands);
           error();
    }
           free(path);
           exit(1);
 }

} else {
    // parent process
    wait(NULL);
    // close the write end of the pipe in the parent
    close(pipefd[1]);
    // do I read here?


 }

Ожидаемые результаты - их чтение из канала и последующий вызов execv для этогоданные.

1 Ответ

0 голосов
/ 15 февраля 2019

Вам необходимо разработать протокол между двумя концами канала, позволяющий отправлять сообщение «SET_BUFF_SIZE» между двумя концами канала.или Используйте буфер фиксированного размера с началом и концом строк символов сообщения, что позволит вам «разделить» ваши данные на несколько операций чтения при необходимости.

...