大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 淺談Linux管道

淺談Linux管道

更新時間:2020-12-16 17:42:17 來源:動力節點 瀏覽1486次

管道(pipe)是一個我們在學習Linux命令行的時候就會引入的一個很重要的概念。管道是UNIX環境中歷史最悠久的進程間通信方式,從本質上說,管道也是一種文件,也是遵循UNIX的“一切皆文件”的原則設計的。雖然實現形態上是文件,但是管道本身并不占用磁盤或者其他外部存儲的空間。在Linux的實現上,它占用的是內存空間。所以,Linux管道實際上就是一個操作方式為文件的內存緩沖區。

 

一、Linux管道分兩種類型:匿名管道和命名管道也叫做有名或無名管道

匿名管道最常見的形態就是我們在shell操作中最常用的”|”。它的特點是只能在父子進程中使用,父進程在產生子進程前必須打開一個管道文件,然后fork產生子進程,這樣子進程通過拷貝父進程的進程地址空間獲得同一個管道文件的描述符,以達到使用同一個管道通信的目的。此時除了父子進程外,沒人知道這個管道文件的描述符,所以通過這個管道中的信息無法傳遞給其他進程。這保證了傳輸數據的安全性,當然也降低了管道了通用性,于是系統還提供了命名管道。

 

二、Linux管道的實現機制    

在Linux中,管道是一種使用非常頻繁的通信機制。從本質上說,管道也是一種文件,但它又和一般的文件有所不同,管道可以克服使用文件進行通信的兩個問題:

1.限制管道的大小。實際上,管道是一個固定大小的緩沖區。在Linux中,該緩沖區的大小為1頁,即4K字節,使得它的大小不象文件那樣不加檢驗地增長。使用單個固定緩沖區也會帶來問題,比如在寫管道時可能變滿,當這種情況發生時,隨后對管道的write()調用將默認地被阻塞,等待某些數據被讀取,以便騰出足夠的空間供write()調用寫。

 

2.讀取進程也可能工作得比寫進程快。當所有當前進程數據已被讀取時,管道變空。當這種情況發生時,一個隨后的read()調用將默認地被阻塞,等待某些數據被寫入,這解決了read()調用返回文件結束的問題。注意:從管道讀數據是一次性操作,數據一旦被讀,它就從管道中被拋棄,釋放空間以便寫更多的數據。

 

三、linux管道的結構

在 Linux 中,管道的實現并沒有使用專門的數據結構,而是借助了文件系統的file結構和VFS的索引節點inode。通過將兩個 file 結構指向同一個臨時的 VFS 索引節點,而這個 VFS 索引節點又指向一個物理頁面而實現的。

 

四、linux管道的代碼示例

管道由pipe函數創建:

#include <unistd.h>

int pipe(int filedes[2]);

 

調用pipe函數時在內核中開辟一塊緩沖區(稱為管道)用于通信,它有一個讀端一個寫端,然后通過filedes參數傳出給用戶程序兩個文件描述符,filedes[0]指向管道的讀端,filedes[1]指向管道的寫端。向這個文件讀寫數據其實是在讀寫內核緩沖區。pipe函數調用成功返回0,調用失敗返回-1。

 

子進程通過管道向父進程發送數據。限制在父子進程間通信。

#include<stdlib.h>

#include<stdio.h>

#include<sys/types.h>

#include<sys/wait.h>

#include<unistd.h>

#include<string.h>

 

int main () {

    char* msg;

    char buf[20];

    int pipe_filed[2];

    pipe(pipe_filed);

    pid_t pid = fork();

    if(pid < 0) {

        perror("fork errir.");

        exit(1);

    } else if (0 == pid) {

        msg = "child";

        write(pipe_filed[1], msg, sizeof(msg));

        printf("child process send: %s\n", msg);

    } else {

        read(pipe_filed[0], buf, sizeof(buf));

        printf("parent process recv: %s\n", buf);

 

        int status;

        wait(&status);

        if (WIFEXITED(status))

            printf("Child exited with code %d\n", WEXITSTATUS(status));

        else if (WIFSIGNALED(status))

            printf("Child terminated abnormally, signal %d\n", WTERMSIG(status));

    }

 

    return 0;

}

兩個進程通過一個管道只能實現單向通信,比如上面的例子,子進程寫父進程讀,如果有時候也需要父進程寫子進程讀,就必須另開一個管道。

 

管道其實是一個在內核內存中維護的緩沖器,這個緩沖器的存儲能力是有限的。管道被填滿之后,后續向管道寫入操作都會被堵塞直到有讀取進程讀取管道中的數據。至于如何從Linux管道中讀取數據,可以在本站的Linux教程中找到詳細的解答。


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 97视频观看 | 日日摸夜夜欧美一区二区 | 91久久亚洲精品国产一区二区 | 久久久久伊人 | 一级特黄aa大片欧美小说 | 欧美狠狠 | 国产热re99久久6国产精品 | 94久久国产乱子伦精品免费 | 福利视频专区 | 91探花在线视频 | 国产成+人+亚洲+欧美综合 | 精品一区二区三区在线观看视频 | 五月婷婷国产 | 天天操天天擦 | 亚洲欧美国产中文 | 北条麻妃手机在线观看 | 午夜精品成年片色多多 | 特一级男女性色大片 | 亚洲一区视频在线 | 在线看欧美三级中文经典 | 美女视频很黄很暴黄是免费的 | 天天cao在线 | 亚洲一区二区三区播放在线 | 国产成人精品日本亚洲语音1 | 免费看成人播放毛片 | 日本一级在线播放线观看视频 | 青青青青青国产免费观看 | 亚欧在线视频 | 精品一精品国产一级毛片 | 国产精品u任我爽爆在线播放 | 亚洲码和乱人伦中文一区 | 999人在线精品播放视频 | 香蕉视频网站在线观看 | 综合视频在线 | 亚洲伊人久久综合 | 国产福利在线小视频 | 国产激情久久久久影院小草 | 免费的黄色网 | 国产精品国产三级国产an | 视频免费1区二区三区 | 日韩精品另类天天更新影院 |