不知道将通过管道发送多少数据时,如何从管道读取数据?

时间:2019-02-15 07:57:41

标签: c shell pipe exec

我试图通过管道将excev调用的输出传递给它,然后对其进行另一个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 :(得分:0)

您需要在管道的两端之间开发一个协议,使您能够在管道的两端之间发送“ SET_BUFF_SIZE”消息。 要么 在消息字符串的开头和结尾使用固定大小的缓冲区,这将使您可以根据需要将数据“分块”为多次读取。