在Linux中使用C管道

时间:2010-05-10 16:03:13

标签: c linux pipe

我正在开设操作系统课程,我们应该学习如何使用管道在进程之间传输数据。

我们获得了这段简单的代码,演示了如何使用管道,但我很难理解它。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main()
{
      int  pipefd [2], n;
      char buff[100] ;


      if( pipe( pipefd) < 0)
      {
        printf("can not create pipe \n");
      }
      printf("read fd = %d, write fd = %d \n", pipefd[0], pipefd[1]);
      if ( write (pipefd[1],"hello world\n", 12)!= 12)
      {
        printf("pipe write error \n");
      }
      if(  ( n = read ( pipefd[0] , buff, sizeof ( buff)  ) ) <= 0 )
      {
        printf("pipe read error \n");
      }
      write ( 1, buff, n ) ;
exit (0);
  }

写功能有什么作用?它似乎将数据发送到管道并将其打印到屏幕上(至少看起来这是第二次调用write函数时它会这样做)。

有没有人有好的网站建议来了解这个主题,如FIFO,信号,C中使用的其他基本linux命令?

3 个答案:

答案 0 :(得分:5)

程序通过pipe(2)调用创建管道。管道有一个文件描述符,可以读取(pipefd[0]),另一个可以写入(pipefd[1])。程序首先将“hello world \ n”写入管道的 write 端,然后从管道的 read 端读取消息。然后通过write(2)调用文件描述符1将消息写入控制台(stdout)。


Beej's Guide to Unix Interprocess Communication提供了有关Unix / Linux IPC的一些很好的信息。您经常会找到他的其他指南Beej's Guide to Network Programming的参考资料。

我发现Bruce Molay的Understanding UNIX/LINUX Programming: A Guide to Theory and Practice是关于Unix / Linux系统编程的优秀书籍。

答案 1 :(得分:4)

write()的第一个参数是要写入的file descriptor

在第一次调用中,代码正在写入管道的一端(pipefd[1])。在第二次调用中,它正在写入文件描述符1,它在POSIX兼容系统中始终是标准输出(控制台)。文件描述符2是标准错误,因为它的价值。

答案 2 :(得分:3)

该函数创建一个管道并将其终止文件描述符存储在pipefd[0]pipefd[1]中。你写到一端的任何东西都可以从另一端读取,反之亦然。第一个write()调用将“hello world”写入pipefd[1]read()调用从pipefd[0]读取相同的数据。然后,第二个write()调用将该数据写入文件描述符1,默认情况下为STDOUT,这就是您在屏幕上看到它的原因。

管道起初可能会令人困惑。当您阅读/编写更多使用它们的代码时,它们将变得更容易理解。我推荐W. Richard Stevens UNIX环境中的高级编程作为理解它们的好书。我记得,它有很好的代码示例。