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

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

淺談Linux管道

更新時(shí)間:2020-12-16 17:42:17 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1628次

管道(pipe)是一個(gè)我們?cè)趯W(xué)習(xí)Linux命令行的時(shí)候就會(huì)引入的一個(gè)很重要的概念。管道是UNIX環(huán)境中歷史最悠久的進(jìn)程間通信方式,從本質(zhì)上說,管道也是一種文件,也是遵循UNIX的“一切皆文件”的原則設(shè)計(jì)的。雖然實(shí)現(xiàn)形態(tài)上是文件,但是管道本身并不占用磁盤或者其他外部存儲(chǔ)的空間。在Linux的實(shí)現(xiàn)上,它占用的是內(nèi)存空間。所以,Linux管道實(shí)際上就是一個(gè)操作方式為文件的內(nèi)存緩沖區(qū)。

 

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

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

 

二、Linux管道的實(shí)現(xiàn)機(jī)制    

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

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

 

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

 

三、linux管道的結(jié)構(gòu)

在 Linux 中,管道的實(shí)現(xiàn)并沒有使用專門的數(shù)據(jù)結(jié)構(gòu),而是借助了文件系統(tǒng)的file結(jié)構(gòu)和VFS的索引節(jié)點(diǎn)inode。通過將兩個(gè) file 結(jié)構(gòu)指向同一個(gè)臨時(shí)的 VFS 索引節(jié)點(diǎn),而這個(gè) VFS 索引節(jié)點(diǎn)又指向一個(gè)物理頁面而實(shí)現(xiàn)的。

 

四、linux管道的代碼示例

管道由pipe函數(shù)創(chuàng)建:

#include <unistd.h>

int pipe(int filedes[2]);

 

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

 

子進(jìn)程通過管道向父進(jìn)程發(fā)送數(shù)據(jù)。限制在父子進(jìn)程間通信。

#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;

}

兩個(gè)進(jìn)程通過一個(gè)管道只能實(shí)現(xiàn)單向通信,比如上面的例子,子進(jìn)程寫父進(jìn)程讀,如果有時(shí)候也需要父進(jìn)程寫子進(jìn)程讀,就必須另開一個(gè)管道。

 

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


提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 高清国产在线 | 一级片视频免费观看 | 伊在人香蕉99久久 | 天天色网站 | 亚洲国产精品第一区二区 | 欧美xxxx狂喷水喷水 | 99精品热线在线观看免费视频 | 国产综合久久久久久鬼色 | 亚洲欧洲中文日产 | 亚洲激情视频网站 | 成人国产精品毛片 | 欧洲在线免费视频 | 不卡猪| 欧美日韩国产综合一区二区三区 | 亚洲精品乱码久久久久久v 亚洲精品乱码久久久久久麻豆 | 任你干精品视频 | 日韩中文字幕在线 | 99资源站 | 看全色黄大色大片免费久久久 | 天天干夜夜做 | 免费精品美女久久久久久久久久 | 久热九九| 一级高清毛片免费a级高清毛片 | 麻豆亚洲 | 四虎精品影视 | 亚洲欧美二区三区久本道 | 国产精选自拍 | 日韩在线1 | 久久久穴| 午夜论坛| 国产成人爱片免费观看视频 | 久久乱码精品区中文字幕 | 国内精品免费久久久久妲己 | 一本大道高清香蕉中文大在线 | 日本韩国欧美在线观看 | 中文字幕日韩在线一区国内 | 亚洲国产精品综合久久久 | 99国产国人青青视频在线观看 | 日韩一及片 | 国产成人短视频 | 四虎影视在线看免费观看 |