【问题标题】:How does pipe() identify file descriptorpipe() 如何识别文件描述符
【发布时间】:2014-10-23 15:19:51
【问题描述】:

我最近在学习 linux 操作系统。我对 pipe() 函数有疑问。 如果我定义了一个int fd[2],pipe() 是否会自动知道fd[0] 被读取而fd[1] 被写入?

如果我想创建一个双射管道,这是否意味着我应该定义两个数组int fd[2]int fd_1[2]?我必须使用“fd”作为数组名称吗?我可以用别人吗??

非常感谢!!

【问题讨论】:

    标签: linux pipe


    【解决方案1】:

    这是pipe(2) 系统调用的定义。成功时,它会填充您传递给它的数组的两个元素(索引[0] 的第一个元素是读取端,索引[1] 的第二个元素是写入端)。不要忘记针对错误情况进行测试。

    您传递给 pipe 或任何 C 函数的参数的名称无关紧要(特别是因为这些名称仅在编译时知道,而不是在运行时知道;它也可能是一些复杂的指针表达式)。但是在运行时它应该是一个指向两个int-s的有效内存区域的指针

    请阅读Advanced Linux Programming,并养成阅读您正在使用的每个函数的文档的习惯。

    另请阅读pipe(7)socketpair(2)fifo(7)syscalls(2)poll(2)

    你经常在fork(2)之前调用pipe(2)并且你通常close(2)父进程和子进程中管道的不同端。

    【讨论】:

    • 谢谢!!我可以在正确的进程部分创建两个管道并关闭关闭读写端吗?那会奏效吗?谢谢!!
    • 您可以创建内核允许的任意多对管道(通常您可以调用pipe 数千次)。
    【解决方案2】:

    您必须在一个进程中关闭读取端并在另一个进程中关闭写入端才能成功完成数据传输。 您可以随意命名数组。 据我所知,只有 BSD 支持某种双向管道。

    【讨论】:

    • 不,您不必关闭管道。但你通常应该这样做。
    猜你喜欢
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多