Linux下的管道編程技術(3)

發表于:2013-03-06來源:開源黃頁作者:天狼星點擊數: 標簽:linux
圖2:示例代碼1中半雙工管道的示意圖 這個例子中,通信是在具有共同祖先的進程間發生的,即父進程和子進程通信。這樣做局限性太大,但我們只是用它

  圖2:示例代碼1中半雙工管道的示意圖

  這個例子中,通信是在具有共同祖先的進程間發生的,即父進程和子進程通信。這樣做局限性太大,但我們只是用它來給讀者一個感性的認識。接下來,我們將介紹更為高級的進程間的管道通信。

  2.進程間通信管道編程

  在利用管道技術進行編程時,處理要用到上面介紹的pipe函數外,還用到另外三個函數,如下所示。

   pipe函數:該函數用于創建一個新的匿名管道。

   dup函數:該函數用于拷貝文件描述符。

   mkfifo函數:該函數用于創建一個命名管道(fifo)。

  當然,在管道通信過程中還用到其它函數,到時我們會加以介紹。需要注意的是,說到底,管道無非就是一對文件描述符,因此任何能夠操作文件操作符的函數都可以使用管道。這包括但不限于這些函數:select、read、write、 fcntl、freopen,等等。

  2.1函數pipe

  函數pipe用來建立一個新的管道,該管道用兩個文件描述符進行描述。函數pipe的原型如下所示:

#include
int pipe( int fds[2] );

  當調用成功時,函數pipe返回值為0,否則返回值為-1。成功返回時,數組fds被填入兩個有效的文件描述符。數組的第一個元素中的文件描述符供應用程序讀取之用,數組的第二個元素中的文件描述符可以用來供應用程序寫入。

  下 面我們考察在一個包含多個進程的應用程序中的管道示例。在該程序中(見示例代碼2),第14行用于創建一個管道,然后進程在第16行分叉,變成一個父進程 和一個子進程。在子進程中,我們嘗試從(在第18行建立的)管道的輸入描述符讀取,這時該進程將被掛起,直到管道中有可以讀取的內容為止。

  讀完后,我們用NULL作為讀取的內容的結束符,這樣的話,讀的這些內容就能使用printf函數正確打印輸出了。父進程先是利用存放在thePipe[1]中的“寫文件標識符”向管道寫入測試字符串,然后就使用wait函數來等待子進程退出。

  在 我們的這個程序中需要加以注意的是,我們的子進程是如何繼承父進程利用pipe函數建立的文件描述符的,以及如何利用該文件描述符進行通信的。函數 fork一旦執行,子進程會繼承父進程的功能和管道的文件描述符,但對于內核來說,父進程和子進程是平等的,它們是獨立運行的。也就是說,兩個進程分別具 有單獨的內存空間,它們正是通過pipe函數來互通有無的。

示例代碼2:演示兩個進程間的管道模型的代碼
1: #include
2: #include
3: #include
4: #include
5:
6: #define MAX_LINE 80
7:
8: int main()
9: ...{
10: int thePipe[2], ret;
11: char buf[MAX_LINE+1];
12: const char *testbuf=...{"a test string."};
13:

原文轉自:http://yp.oss.org.cn/blog/show_resource.php?resource_id=598

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97