我正在开设操作系统课程,我们应该学习如何使用管道在进程之间传输数据。
我们获得了这段简单的代码,演示了如何使用管道,但我很难理解它。
#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命令?
答案 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环境中的高级编程作为理解它们的好书。我记得,它有很好的代码示例。