为什么写入fd [1]并读取fd [0]?

时间:2015-04-28 13:41:21

标签: linux shell linux-kernel

我正在学习linux操作系统,我对管道有疑问。

我想实现一个管道。

所以我定义int fd[2];

但是为什么要读fd[0]而写fd[1]

0代表stdin吗? (我认为它是写的)和1代表stdout(我认为它已经读过)

我可以让fd[0]为写,fd[1]为读?

谢谢你们。

2 个答案:

答案 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]。