我试图通过管道将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调用。
答案 0 :(得分:0)
您需要在管道的两端之间开发一个协议,使您能够在管道的两端之间发送“ SET_BUFF_SIZE”消息。 要么 在消息字符串的开头和结尾使用固定大小的缓冲区,这将使您可以根据需要将数据“分块”为多次读取。