2010-05-10 83 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系統編程的優秀書籍。