在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

闡述匿名管道和命名管道

汽車(chē)電子技術(shù) ? 來(lái)源:wenzi嵌入式軟件 ? 作者: wenzid ? 2023-01-20 17:17 ? 次閱讀

概述

管道是 UNIX系統(tǒng) IPC的最古老的形式,所有的UNIX系統(tǒng)都提供此種通信。所謂的管道,也就是內(nèi)核里面的一串緩存,從管道的一段寫(xiě)入的數(shù)據(jù),實(shí)際上是緩存在內(nèi)核中的,令一端讀取,也就是從內(nèi)核中讀取這段數(shù)據(jù)。對(duì)于管道傳輸?shù)臄?shù)據(jù)是無(wú)格式的流且大小受限。對(duì)于管道來(lái)說(shuō),也分為匿名管道和命名管道,其中命名管道也被叫做 FIFO,下面則分別闡述這兩種管道。

匿名管道

微信截圖_20230105161930.png

默認(rèn)情況下,在 Shell命令執(zhí)行過(guò)程中,任何一個(gè)命令都有一個(gè)標(biāo)準(zhǔn)輸入設(shè)備(鍵盤(pán))、標(biāo)準(zhǔn)輸出設(shè)備(顯示器)和標(biāo)準(zhǔn)輸出設(shè)備(顯示器),使用管道"|"可以將兩個(gè)命令連接起來(lái),從而改變標(biāo)準(zhǔn)的輸入輸出方式,下面是在 Linux 端運(yùn)行命令行的一個(gè)截圖:

微信截圖_20230105161930.png

上述命令中的意思也就是,將ls命令得到的結(jié)果作為 grep tags命令的輸入。

連接輸入輸出的中間設(shè)備即為一個(gè)管道文件,綜上,也就是說(shuō)使用管道可以將一個(gè)命令的輸出作為另一個(gè)命令的輸入(在運(yùn)行的時(shí)候,一個(gè)命令將創(chuàng)建一個(gè)進(jìn)程),而這種管道是臨時(shí)的,命令執(zhí)行完畢之后就會(huì)自動(dòng)消失,這類(lèi)管道稱(chēng)為 無(wú)名管道

匿名管道例子

匿名管道在使用前要先創(chuàng)建,其函數(shù)的聲明如下:

extern int pipe (int __pipedes[2]);

此函數(shù)的參數(shù)是一個(gè)整型數(shù)組,如果執(zhí)行成功,pipe 將存儲(chǔ)兩個(gè)整型文件描述符于__pipedes[0]__pipedes[1]中,他們分別指向管道的兩端。如果系統(tǒng)調(diào)用失敗,則返回 -1。

讀無(wú)名管道,該函數(shù)的聲明如下:

extern ssize_t read (int __fd, void *__buf, size_t __nbytes);

第一個(gè)參數(shù)fd為打開(kāi)的文件描述符,buf為讀出數(shù)據(jù)的存儲(chǔ)位置,nbytes為讀取數(shù)據(jù)的大小,調(diào)用 read 函數(shù)將從 fd 指向的文件描述符指定的打開(kāi)文件中宏讀 n 字節(jié)到 buf 指向的緩沖區(qū)內(nèi)。

如果試圖向已經(jīng)填滿的管道寫(xiě)入,系統(tǒng)會(huì)自動(dòng)阻塞。一個(gè)管道不能同時(shí)被兩個(gè)進(jìn)程打開(kāi)。

extern ssize_ t write(int __fd, __const void *__buf, size_t __n);

buf指向的緩沖區(qū)中向管道中寫(xiě)入nbytes字節(jié),且每次寫(xiě)入的內(nèi)容都附件在管道的末端。

微信截圖_20230105161930.png

那要如何使用管道在兩個(gè)進(jìn)程之間通信呢,我們可以使用 fork()創(chuàng)建子進(jìn)程,創(chuàng)建的子進(jìn)程會(huì)復(fù)制父進(jìn)程的文件描述符,這樣就做到了兩個(gè)進(jìn)程各有兩個(gè)fd[0]與fd[1],兩個(gè)進(jìn)程就可以通過(guò)各自的fd寫(xiě)入和讀取同一個(gè)管道文件實(shí)現(xiàn)進(jìn)程通信了,具體原理如下所示:

具體的例子如下所示:

#include
#include
#include

int main(int argc, char *argv[])
{
    pid_t pid;
    int temp;
    int pipedes[2];
    char s[14] = "test message!";
    char d[14];

    if (pipe(pipedes) == -1) // 創(chuàng)建管道
    {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    if (pid == fork() == -1)
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    else if (pid == 0)      // 子進(jìn)程
    {
        printf("now,write data to pipe\\n");
        if (write(pipedes[1], s, 14) == -1)   // 寫(xiě)數(shù)據(jù)到管道
        {
            perror("write");
            exit(EXIT_FAILURE);
        }
        else
        {
            printf("the written data is:%s\\n",s);
            exit(EXIT_SUCESS);
        }
    }
    else if (pid > 0)     // 父進(jìn)程
    {
        slepp(2);
        printf("now, read from pipe\\n");
        if ((read(pipedes[0], d, 14)) == -1)
        {
            perror("read");
            exit(EXIT_FAILURE);
        }
        printf("the data from pipe is:%s\\n",d);
    }
    return 0;
}

微信截圖_20230105161930.png

代碼運(yùn)行的結(jié)果如下所示:

命名管道

命名管道又被稱(chēng)之為是 FIFO ,未命名的管道只能在兩個(gè)相關(guān)的進(jìn)程之間使用,而且這兩個(gè)相關(guān)的進(jìn)程還要又一個(gè)共同創(chuàng)建了他們的祖先進(jìn)程,但是,通過(guò) FIFO ,不相關(guān)的進(jìn)程也能交換數(shù)據(jù)。

首先,介紹下是如何創(chuàng)建命名管道的:

extern int mkfifo (__const char *__path, __mode_t __mode);

mkfifo會(huì)根據(jù)參數(shù)建立特殊的有名管道文件,該文件必須不存在,而參數(shù)mode為該文件的權(quán)限。

下面是一個(gè)使用命名管道進(jìn)行進(jìn)程間通信的例子,例子分為兩個(gè)程序,分別是讀部分和寫(xiě)部分,首先看先往管道寫(xiě)數(shù)據(jù)的代碼,代碼如下所示:

#include  
#include  
#include  
#include  
#include  
#include  

int main() 
{ 
    int fd; 

    // FIFO file path 
    char * myfifo = "/tmp/myfifo"; 

    // Creating the named file(FIFO) 
    // mkfifo(, ) 
    mkfifo(myfifo, 0666); 

    char arr1[80], arr2[80]; 
    while (1) 
    { 
        // Open FIFO for write only 
        fd = open(myfifo, O_WRONLY); 
        printf("The fd is:%d\\n",fd);

        // Take an input arr2ing from user. 
        // 80 is maximum length 
        fgets(arr2, 80, stdin); 

        // Write the input arr2ing on FIFO 
        // and close it 
        write(fd, arr2, strlen(arr2)+1); 
        close(fd); 

        // Open FIFO for Read only 
        fd = open(myfifo, O_RDONLY); 

        // Read from FIFO 
        read(fd, arr1, sizeof(arr1)); 

        // Print the read message 
        printf("User2: %s", arr1); 
        close(fd); 
    } 
    return 0; 
}

然后是先往管道讀數(shù)據(jù)的代碼,代碼如下所示:

微信截圖_20230105161930.png

#include  
#include  
#include  
#include  
#include  
#include  

int main() 
{ 
    int fd1; 

    // FIFO file path 
    char * myfifo = "/tmp/myfifo"; 

    char str1[80], str2[80]; 
    while (1) 
    { 
        // First open in read only and read 
        fd1 = open(myfifo,O_RDONLY); 
        printf("The fd is:%d\\n",fd1);
        read(fd1, str1, 80); 

        // Print the read string and close 
        printf("User1: %s", str1); 
        close(fd1); 

        // Now open in write mode and write 
        // string taken from user. 
        fd1 = open(myfifo,O_WRONLY); 
        fgets(str2, 80, stdin); 
        write(fd1, str2, strlen(str2)+1); 
        close(fd1); 
    } 
    return 0; 
}

下面是代碼運(yùn)行的一個(gè)結(jié)果:

說(shuō)明一下,就是說(shuō)當(dāng)運(yùn)行 write程序的時(shí)候,會(huì)創(chuàng)建fifo文件,命名管道,然后,在 write文件中就執(zhí)行open操作,但是,這里存在的一個(gè)問(wèn)題就是,因?yàn)樵谶\(yùn)行 write程序的時(shí)候,沒(méi)有進(jìn)程打開(kāi)讀端,也就阻塞了 open函數(shù)的運(yùn)行,只有運(yùn)行read操作,以讀的方式讀取管道的數(shù)據(jù),這樣才能使得write中的open函數(shù)繼續(xù)執(zhí)行。

綜上,也就是命名管道在進(jìn)程中通信的一個(gè)例子。

小結(jié)

上述就是本次進(jìn)程通信中關(guān)于管道的相關(guān)內(nèi)容,其中就包括匿名管道以及命名管道,他們之間存在著差別嗎,也各有各的應(yīng)用,本次的分享就到這里啦~

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • UNIX
    +關(guān)注

    關(guān)注

    0

    文章

    296

    瀏覽量

    41919
  • 管道
    +關(guān)注

    關(guān)注

    3

    文章

    146

    瀏覽量

    18125
  • IPC
    IPC
    +關(guān)注

    關(guān)注

    3

    文章

    356

    瀏覽量

    52586
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux匿名管道命名管道的區(qū)別

    數(shù)據(jù)。對(duì)于管道傳輸?shù)臄?shù)據(jù)是無(wú)格式的流且大小受限。對(duì)于管道來(lái)說(shuō),也分為匿名管道命名管道,其中
    發(fā)表于 10-12 12:50 ?1119次閱讀

    標(biāo)準(zhǔn)流管道

    華清遠(yuǎn)見(jiàn)嵌入式linux學(xué)習(xí)資料《標(biāo)準(zhǔn)流管道》,1.標(biāo)準(zhǔn)流管道函數(shù)說(shuō)明 。與Linux的文件操作中有基于文件流的標(biāo)準(zhǔn)I/O操作一樣,管道的操作也支持基于文件流的模式。這種基于文件流的管道
    發(fā)表于 09-09 14:13

    無(wú)名管道系統(tǒng)調(diào)用

    `華清遠(yuǎn)見(jiàn)嵌入式linux學(xué)習(xí)資料《無(wú)名管道系統(tǒng)調(diào)用》, 1.管道創(chuàng)建與關(guān)閉說(shuō)明。管道是基于文件描述符的通信方式,當(dāng)一個(gè)管道建立時(shí)它會(huì)創(chuàng)建兩個(gè)文件描述符fd[0]和fd,其中fd[0]
    發(fā)表于 09-09 14:17

    命名管道FIFO讀寫(xiě)規(guī)則

    Linux命名管道FIFO的讀寫(xiě)規(guī)則《Linux程序設(shè)計(jì)(第3版)》對(duì)于Linux命名管道的讀寫(xiě)規(guī)則詳解的不夠詳細(xì)和清楚,查了些資料,在此總結(jié)一下: 1.從FIFO中讀取數(shù)據(jù):約定:如
    發(fā)表于 09-24 10:49

    匿名管道是什么?有何功能?

    這是我第一次出教程,若不好可在評(píng)論回復(fù)我哦(?。?)~~~~~注:匿名管道是一個(gè)未命名的單相管道,通常用來(lái)在一個(gè)父進(jìn)程和一個(gè)子進(jìn)程之間的傳輸數(shù)據(jù)。
    發(fā)表于 07-09 07:26

    怎樣通過(guò)匿名管道去實(shí)現(xiàn)進(jìn)程間的通信呢

    進(jìn)程通信是指什么?怎樣通過(guò)匿名管道去實(shí)現(xiàn)進(jìn)程間的通信呢?有哪些步驟?
    發(fā)表于 12-24 06:45

    有名管道的相關(guān)資料分享

    進(jìn)程間通信在實(shí)際項(xiàng)目中多多少少都會(huì)使用到,最常用的有無(wú)名管道,有名管道,消息隊(duì)列,信號(hào),信號(hào)量,共享內(nèi)存等進(jìn)程間的通信方式。網(wǎng)絡(luò)通信套字節(jié) socket的方式也可以歸為進(jìn)程通行。無(wú)名管道只能用于有
    發(fā)表于 12-24 08:08

    RT-Thread的管道有什么特點(diǎn)呢?怎么去使用

    一. 什么是管道pipe: 匿名管道。對(duì)于熟悉 linux 開(kāi)發(fā)的人來(lái)說(shuō),pipe 就很熟悉了。pipe 是一種 IPC 機(jī)制,他的作用是用作有血緣進(jìn)程間完成數(shù)據(jù)傳遞,只能從一端寫(xiě)入,從另外一端讀出
    發(fā)表于 04-14 14:57

    管道ADC,管道ADC原理及作用是什么?

    管道ADC,管道ADC原理及作用是什么? 人們都習(xí)慣把管道ADC稱(chēng)為流水線ADC,流水線結(jié) 構(gòu)中各模數(shù)轉(zhuǎn)換級(jí)處于并行工作狀態(tài),提高了轉(zhuǎn)換速率;如果要增
    發(fā)表于 03-24 13:35 ?2283次閱讀

    水曖管道工實(shí)用手冊(cè)

    本書(shū)較全面系統(tǒng)地闡述了水暖管道所必備的知識(shí)與安裝的基本技術(shù)。內(nèi)容包括:水暖管道工的基本知識(shí),常用工具,常用器材,基本操作技術(shù),室內(nèi)外管道安裝,工業(yè)
    發(fā)表于 04-15 10:09 ?0次下載
    水曖<b class='flag-5'>管道</b>工實(shí)用手冊(cè)

    Linux系統(tǒng)管道和有名管道的通信機(jī)制解析

    Linux 進(jìn)程間通信的幾種主要手段。其中管道和有名管道是最早的進(jìn)程間通信機(jī)制之一,管道可用于具有親緣關(guān)系進(jìn)程間的通信,有名管道克服了管道沒(méi)
    發(fā)表于 11-07 10:51 ?0次下載

    Linux中的管道命名管道介紹

    在 Linux 中,pipe 能讓你將一個(gè)命令的輸出發(fā)送給另一個(gè)命令。管道,如它的名稱(chēng)那樣,能重定向一個(gè)進(jìn)程的標(biāo)準(zhǔn)輸出、輸入和錯(cuò)誤到另一個(gè)進(jìn)程,以便于進(jìn)一步處理。
    的頭像 發(fā)表于 09-23 10:33 ?4143次閱讀
    Linux中的<b class='flag-5'>管道</b>和<b class='flag-5'>命名</b><b class='flag-5'>管道</b>介紹

    你所不知道的linux匿名管道知識(shí)詳解

    通過(guò)上面的解釋可以看到, 假設(shè) COMMAND1 | COMMAND2, 那么COMMAND1的標(biāo)準(zhǔn)輸出, 將會(huì)被綁定到管道的寫(xiě)端, 而COMMAND2的標(biāo)準(zhǔn)輸入將會(huì)綁定到管道的讀端, 所以當(dāng)COMMAND1一有輸出, 將會(huì)馬上通過(guò)
    的頭像 發(fā)表于 12-31 09:04 ?3435次閱讀
    你所不知道的linux<b class='flag-5'>匿名</b><b class='flag-5'>管道</b>知識(shí)詳解

    使用匿名管道技術(shù)獲取CMD命令的執(zhí)行結(jié)果

    遠(yuǎn)程 CMD 是指惡意程序接收到控制端發(fā)送的 CMD 指令后,在本地執(zhí)行 CMD 命令,并將執(zhí)行結(jié)果回傳至控制端。本文將演示使用匿名管道技術(shù)獲取 CMD 命令的執(zhí)行結(jié)果。
    的頭像 發(fā)表于 04-03 18:04 ?4424次閱讀

    linux管道概述

    一、進(jìn)程間通信(IPC)介紹 進(jìn)程間通信(IPC,InterProcess Communication)是指在不同進(jìn)程之間傳播或交換信息。 IPC的方式通常有管道(包括無(wú)名管道命名管道
    的頭像 發(fā)表于 02-18 14:51 ?613次閱讀
    linux<b class='flag-5'>管道</b>概述
    主站蜘蛛池模板: 成人18毛片 | 热99精品视频 | 免费不卡毛片 | 国产精品久久免费观看 | 天天视频在线观看免费 | 午夜激情福利视频 | wwwcom日本| 好紧好爽太大了h视频 | 久热福利视频 | 五夜婷婷| 可以免费观看的黄色网址 | 日本天堂网在线观看 | 久久久网站亚洲第一 | 亚洲精品一区二区中文 | 波多久久夜色精品国产 | 入逼视频 | 欧美黄色片在线播放 | 婷婷在线网站 | 奇米影视狠狠 | 天天舔天天干天天操 | 户外露出精品视频国产 | 欧美一级免费观看 | 久久狠狠躁免费观看 | 午夜视频入口 | 狠狠干夜夜爽 | 国产网红主播chinese | 一级特黄aaaaaa大片 | 人人澡人人澡人人看青草 | 有坂深雪在线 | 欧美激情二区三区 | a级毛片免费网站 | 男人操女人免费 | 午夜aaaaaaaaa视频在线 | 国产性videostv另类极品 | 91热成人精品国产免费 | 手机看片福利 | 国产香港日本三级在线观看 | 37pao强力打造免费高速高清 | 狠狠操狠狠干 | 欧美一区二区三区视频在线观看 | 欧洲人体超大胆露私视频 |