我正在查看如何在手册页上使用pipe(2),我不明白他们提供的源代码中的一行。
int
main(int argc, char *argv[])
{
int pipefd[2]; //Isn't this undefined??? so pipe(pipefd) would throw an error?
pid_t cpid;
char buf;
if (argc != 2) {
fprintf(stderr, "Usage: %s <string>\n", argv[0]);
exit(EXIT_FAILURE);
}
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { /* Child reads from pipe */
close(pipefd[1]); /* Close unused write end */
while (read(pipefd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO, "\n", 1);
close(pipefd[0]);
_exit(EXIT_SUCCESS);
} else { /* Parent writes argv[1] to pipe */
close(pipefd[0]); /* Close unused read end */
write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]); /* Reader will see EOF */
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
}
}
我认为非静态函数变量只是内存中的任何内容?为什么这个源代码有效?
答案 0 :(得分:3)
pipefd
数组在此处作为输出参数,因此无需初始化它。 pipe
函数写入。
答案 1 :(得分:0)
数组pipefd返回引用管道末尾的2个fds。这里,pipefd [1]指的是管道的写端,pipefd [0]指的是管道的读端。
在上述计划中:
请注意,如果管道为空则读取阻塞,如果管道已满,则写入阻塞。
另请注意,由于管道是单向的,因此写入管道写入端(pipefd [1])的数据将由内核缓冲,直到从管道的读取端读取(pipefd [0])。