• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 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

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>