我正在学习linux操作系统,我对管道有疑问。
我想实现一个管道。
所以我定义int fd[2];
但是为什么要读fd[0]
而写fd[1]
?
0代表stdin吗? (我认为它是写的)和1代表stdout(我认为它已经读过)
我可以让fd[0]
为写,fd[1]
为读?
谢谢你们。
答案 0 :(得分:2)
这是一个任意的设计选择。
pipe
函数的声明是:
int pipe(int filedes[2]);
给定C关于指针和数组的规则(详细信息请参阅section 6 of the comp.lang.c FAQ),filedes
实际上是int*
类型的指针;它应该指向2元素数组的第0个元素。
如果只返回一个文件描述符,它可以将其作为函数结果返回。由于它需要返回两个文件描述符,它需要一个指针,它可以用来存储这两个值。使用2元素数组是一种简单的方法。
当然,它的设计可能不同。例如,它可能返回了一个结构,或者指向了一个结构,但现有界面并没有真正的问题。
对于输入和输出使用索引0和1与使用文件描述符0和1进行标准输入和标准输出并不特别相关,尽管我认为可能会有一些影响。它确实让人容易记住;例如,我们使用短语“输入/输出”这一事实提醒输入描述符在索引0处,输出描述符在1处。
但最终,它只是这样定义的。它由the POSIX standard指定,它标准化了现有的做法;它起源于早期的UNIX系统,或者甚至更早。
答案 1 :(得分:1)
据我所知,您不能使用fd[0]
进行写入,而使用fd[1]
进行读取。我自己没试过。我理论上已经知道并且已经阅读了Linux内核代码。
pipe()
在Linux内核中调用do_pipe()
。而且,这是我在Linux内核代码中看到的:
实际代码:http://lxr.free-electrons.com/ident?v=2.6.27;i=do_pipe
int do_pipe()
{
return do_pipe_flags(fd,0)
}
int do_pipe_flags(int *fd, int flags)
{
// code
// code
fw = create_write_pipe()
fr = create_read_pipe()
// code
// code
fd[0] = fdr;
fd[1] = fdw;
}
struct file *create_write_pipe(int flags)
{
// code
// code
f->f_flags = O_WRONLY | (flags & O_NONBLOCK);
return f;
}
同样,在create_read_pipe中,它是O_RDONLY
。所以,我的理解是你不能从fd [1]读取并写入fd [0]。