2010-05-10 64 views
0

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

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

#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); 
    } 

是什么写入功能吗?它似乎发送数据到管道,并将其打印到屏幕上(至少看起来像第二次写入功能被称为它)。

有没有人有任何关于这方面的知识,FIFO,信号,在C中使用的其他基本的Linux命令学习的好网站的建议?

回答

3

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

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

4

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

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

5

程序通过pipe(2)调用创建管道。管道有一个文件描述符打开以供读取(pipefd[0]),另一个打开(pipefd[1])。该程序首先写入“hello world \ n”至编写管道末端,然后读取消息读取末尾的管道。该消息然后经由write(2)呼叫写出到控制台(标准输出)到文件描述符1.


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系统编程的优秀书籍。