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

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

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

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

管道和重定向的真實(shí)含義(定義)是什么呢?

Linux愛好者 ? 來(lái)源:TOMORROW ? 作者:TOMORROW ? 2020-12-11 16:26 ? 次閱讀

對(duì)shell有一定了解的人都知道,管道和重定向是 Linux 中非常實(shí)用的 IPC 機(jī)制。

在shell中,我們通常使用符合‘|’來(lái)表示管道,符號(hào)‘>’和‘<’表示重定向。

那么管道和重定向的真實(shí)含義(定義)又是什么呢?

管道

管道的定義

管道就是一個(gè)進(jìn)程與另一個(gè)進(jìn)程之間通信的通道,它通常是用作把一個(gè)進(jìn)程的輸出通過管道連接到另一個(gè)進(jìn)程的輸入。

它是半雙工運(yùn)作的,想要同時(shí)雙向傳輸需要使用兩個(gè)管道。

管道又可以分為匿名管道和命名管道,而shell中使用到的是匿名管道,所以本文僅描述匿名管道。

例如命令ls | grep main.c,使用了管道來(lái)連接了兩條命令來(lái)執(zhí)行,能夠快速地讓我們知道當(dāng)前目錄下是否有 main.c 文件。

管道的本質(zhì)是內(nèi)存中的緩沖區(qū),可以看作是打開到內(nèi)存中的文件。

所以需要使用兩個(gè)文件描述符來(lái)索引它,一個(gè)表示讀端,一個(gè)表示寫端。

并且規(guī)定,數(shù)據(jù)只能從讀端讀取、只能往寫端寫入。

創(chuàng)建管道

使用函數(shù)pipe()可以創(chuàng)建匿名管道,需要包含頭文件 unistd.h,示例代碼:

int fd[2]; pipe(fd);

首先創(chuàng)建一個(gè) 2 個(gè)元素的整型數(shù)組,然后將該數(shù)組作為pipe()的參數(shù),pipe()執(zhí)行成功后,數(shù)組元素 fd[0]的值就會(huì)變成所創(chuàng)建的管道的讀端的文件描述符,fd[1]就會(huì)變成寫端的文件描述符。

至此管道就算創(chuàng)建成功了。

把管道作為標(biāo)準(zhǔn)輸入輸出

管道創(chuàng)建成功后,就可以直接使用 read()和 write()函數(shù)對(duì)管道進(jìn)行數(shù)據(jù)的讀寫。

而因?yàn)閟hell中都是使用標(biāo)準(zhǔn)輸入輸出對(duì)管道進(jìn)行讀寫的,例如ls | grep main.c就是將 ls 的標(biāo)準(zhǔn)輸出寫到了管道寫端,而 grep 的標(biāo)準(zhǔn)輸入則從管道讀端讀取,所以本文也只描述此方法。

示例代碼如下:

int fd[2]; pipe(fd); pid=fork(); if(0==pid) //execute next command in child process { dup2(fd[0],0);//redirect standard input to pipe(read) close(fd[0]); close(fd[1]); if(0!=execvp(cmd0[0],cmd0)) printf("No such command! "); exit(EXIT_SUCCESS); } else //execute current command in current process { dup2(fd[1],1);//redirect standard output to pipe(write) close(fd[0]); close(fd[1]); if(0!=execvp(cmd1[0],cmd1)) printf("No such command! "); exit(EXIT_SUCCESS); }

首先是創(chuàng)建一個(gè)管道,然后創(chuàng)建子進(jìn)程,子進(jìn)程會(huì)繼承這一個(gè)管道,也就保證了父進(jìn)程與子進(jìn)程操作的是同一個(gè)管道(管道的繼承與普通變量不同)。

如果我們希望在子進(jìn)程中執(zhí)行管道的讀端的程序例如ls | grep main.c中的grep main.c;在父進(jìn)程中執(zhí)行管道的寫端的程序,例如ls | grep main.c中的ls。

在子進(jìn)程中,先調(diào)用dup2(fd[0],0);此函數(shù)就是將標(biāo)準(zhǔn)輸入的文件描述符 0,指向了管道的讀端。

文件描述符,本質(zhì)是非負(fù)整數(shù),通常是小整數(shù);它是一個(gè)索引,通過該索引可以找到對(duì)應(yīng)的文件。

例如,標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤的文件描述符默認(rèn)是 0、1、2 。當(dāng)進(jìn)程需要從標(biāo)準(zhǔn)輸入中讀取數(shù)據(jù)時(shí),就會(huì)通過 0 索引找到標(biāo)準(zhǔn)輸入所對(duì)應(yīng)的內(nèi)存緩沖區(qū)來(lái)讀取數(shù)據(jù)。

假設(shè)此時(shí)管道讀端的文件描述符為 3、寫端文件描述符為 4 。

調(diào)用dup2(fd[0],0),實(shí)際上就是將文件描述符 3 指向的文件表項(xiàng)賦值給了文件描述符 0,而文件描述符 0 正是進(jìn)程默認(rèn)的標(biāo)準(zhǔn)輸入。

所以此時(shí),當(dāng)進(jìn)程需要從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)時(shí),進(jìn)程就會(huì)通過文件描述符 0 來(lái)找到管道讀端所對(duì)應(yīng)內(nèi)存緩沖區(qū)。

從而實(shí)現(xiàn)了通過標(biāo)準(zhǔn)輸入來(lái)讀取管道的數(shù)據(jù),也可以說(shuō)是,將管道的讀端重定向到了標(biāo)準(zhǔn)輸入。管道的寫端與標(biāo)準(zhǔn)輸入的關(guān)系也與此類似,此處不再贅述。

3fac420e-2eb2-11eb-a64d-12bb97331649.png

調(diào)用dup2(fd[0],0)之后還需要調(diào)用close()函數(shù)將管道原有的文件描述符關(guān)閉,關(guān)閉的意思是文件描述符 3 和 4 不再索引到管道或者其他文件,也就是說(shuō)此時(shí)使用 read 函數(shù)從文件描述符 3 中是讀取不到管道的數(shù)據(jù)的了,并不是說(shuō)關(guān)閉管道的意思。

完成管道的設(shè)置之后,就可以通過 exec 族函數(shù)來(lái)執(zhí)行外部命令了。

需要注意的是,調(diào)用 exec 族函數(shù)并不會(huì)把管道這種 IPC 資源覆蓋或者重新初始化。

文件重定向

文件重定向其實(shí)與上面管道重定向到標(biāo)準(zhǔn)輸入輸出很類似,甚至可以直接采用上面所說(shuō)的方法來(lái)實(shí)現(xiàn)。但是此處將講述一種更加簡(jiǎn)潔的方法實(shí)現(xiàn)。

實(shí)例代碼如下:

char fileName[20]="out.txt"; freopen(fileName,"w",stdout);//redirect stdout to fileName

以上兩行簡(jiǎn)單的代碼就實(shí)現(xiàn)了,將該進(jìn)程的標(biāo)準(zhǔn)輸出重定向到了文件 out.txt ,甚至一行就可以實(shí)現(xiàn)。

執(zhí)行以上代碼后,當(dāng)前進(jìn)程的所有標(biāo)準(zhǔn)輸出,也就是 printf()之類的輸出全都會(huì)被寫到文件 out.txt,顯示屏將不會(huì)有輸出。

而將進(jìn)程的標(biāo)準(zhǔn)輸入重定向到文件 in.txt 的代碼如下:

char fileName[20]="in.txt"; freopen(fileName,"r",stdin);//redirect stdin to fileName

3fceea20-2eb2-11eb-a64d-12bb97331649.png

其中的核心函數(shù)就是freopen():

3ff9e090-2eb2-11eb-a64d-12bb97331649.png

責(zé)任編輯:lq

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

    關(guān)注

    3

    文章

    4374

    瀏覽量

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

    關(guān)注

    3

    文章

    146

    瀏覽量

    18167
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4891

    瀏覽量

    70361

原文標(biāo)題:Shell:管道與重定向

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    新品發(fā)布:首款原位替換磁通門傳感器的MEMS陀螺工具定向短節(jié)

    在石油天然氣測(cè)井、定向鉆井及管道工程等領(lǐng)域,傳統(tǒng)基于磁通門傳感器的定向測(cè)量設(shè)備常因套管、鉆桿等金屬環(huán)境或地磁場(chǎng)異常干擾,導(dǎo)致方位測(cè)量精度大幅衰減,甚至無(wú)法工作。針對(duì)這一行業(yè)痛點(diǎn),ERICCO為其打造
    的頭像 發(fā)表于 06-11 17:39 ?489次閱讀
    新品發(fā)布:首款原位替換磁通門傳感器的MEMS陀螺工具<b class='flag-5'>定向</b>短節(jié)

    為什么MEMS定向短節(jié)能引領(lǐng)鉆探未來(lái)

    在采礦設(shè)備、定向鉆孔、地質(zhì)鉆探等領(lǐng)域,精準(zhǔn)的定向測(cè)量技術(shù)是保障作業(yè)效率與安全的核心。ER-MNS-09 MEMS定向短節(jié)憑借最新MEMS陀螺技術(shù),以緊湊、可靠、高性能的設(shè)計(jì),成為復(fù)雜環(huán)境下定向
    的頭像 發(fā)表于 06-03 17:28 ?104次閱讀
    為什么MEMS<b class='flag-5'>定向</b>短節(jié)能引領(lǐng)鉆探未來(lái)

    請(qǐng)問CYPD2119可以開發(fā)自定義固件嗎?

    嗨, PSoC 創(chuàng)建器(或任何其他開發(fā)環(huán)境)是否支持針對(duì)此特定設(shè)備的固件開發(fā)? 我 CAN 找到的最接近的是具有可用固件模板的CYPD2122。 如果我能把它重定向到 CYPD2119 我還需要 CYPD2119 的引導(dǎo)加載程序映像,但我還沒找到。
    發(fā)表于 05-29 06:56

    STM32CubeIDE STM32H743XIH6串口無(wú)法重定向,且發(fā)送內(nèi)容波特率不對(duì)亂碼怎么解決?

    STM32CubeIDE重定向無(wú)效果,且使用HAL_UART_Transmit(&huart1, (uint8_t *)\"0123rn\", sizeof
    發(fā)表于 03-11 06:42

    智慧路燈的定向廣播功能:技術(shù)與應(yīng)用的完美融合

    來(lái)了多樣化的超贊應(yīng)用!下面,就跟隨我一起來(lái)深入探索這神奇的定向廣播功能吧! 一、技術(shù)原理 定向廣播功能的核心簡(jiǎn)直太厲害了,它能夠把聲音集中在特定方向傳播,大幅減少聲波散射,從而達(dá)成超精準(zhǔn)的聲音傳播!主要通
    的頭像 發(fā)表于 03-10 17:50 ?358次閱讀
    智慧路燈的<b class='flag-5'>定向</b>廣播功能:技術(shù)與應(yīng)用的完美融合

    DeepSeek獲殊榮,成為ai.com重定向官網(wǎng)

    近日,記者發(fā)現(xiàn),在瀏覽器中輸入“ai.com”這一頂級(jí)域名時(shí),頁(yè)面將直接重定向至DeepSeek的官方網(wǎng)站。這一變化引起了業(yè)界的廣泛關(guān)注,標(biāo)志著DeepSeek在人工智能領(lǐng)域的地位得到了高度認(rèn)可
    的頭像 發(fā)表于 02-11 15:41 ?483次閱讀

    全面掌握Linux重定向技巧:讓命令行操作效率翻倍的秘密

    視作整體,分開沒有單獨(dú)的含義 順序問題: find /etc -name .bashrc > list 2>1 > list 這個(gè)是從左到右有順序的 第一種 xxx > list 2>1 > list 先將要輸出到 stderr 的內(nèi)容重定向到 stdout ,此時(shí)會(huì)產(chǎn)
    的頭像 發(fā)表于 01-08 10:19 ?485次閱讀

    DAC5681Z芯片elay range是什么含義

    手冊(cè)中只列出了4種情況,其他取值比如“001”?還有就是不太理解這里的delay range 是什么含義
    發(fā)表于 12-06 08:28

    嵌入式 學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-shell腳本編寫之輸入輸出重定向

    shell腳本編寫之輸入輸出重定向shell輸出重定向通常是指將執(zhí)行命令的輸出信息從默認(rèn)的標(biāo)準(zhǔn)輸出(即當(dāng)前終端)重新定向到指定文件中。輸入重定向通常是指將命令所需的輸入數(shù)據(jù)的來(lái)源,從標(biāo)
    發(fā)表于 09-24 10:06

    飛凌嵌入式ElfBoard ELF 1板卡-shell腳本編寫之輸入輸出重定向

    shell輸出重定向通常是指將執(zhí)行命令的輸出信息從默認(rèn)的標(biāo)準(zhǔn)輸出(即當(dāng)前終端)重新定向到指定文件中。輸入重定向通常是指將命令所需的輸入數(shù)據(jù)的來(lái)源,從標(biāo)準(zhǔn)輸入(即當(dāng)前終端)更改為從指定文件中獲取。輸出
    發(fā)表于 09-23 10:23

    LM358芯片上的絲印含義是什么?

    LM358 / 3AM ,這里的\"3AM\"表示什么含義? LM358 / 92M這里的\"92M\" 又表示什么含義? 求解釋
    發(fā)表于 09-13 08:13

    重定向了fputc及putchar函數(shù),但printf沒有輸出,為什么?

    重定向了fputc及putchar函數(shù),但printf沒有輸出 刪除了drivers/drv_uart.c drv_uart.h 刪除了文件rt-thread\\components
    發(fā)表于 07-18 07:44

    在ESP8266_RTOS_SDK中應(yīng)該怎么把ESP_LOGI重定向到UART1?

    如題,請(qǐng)問在ESP8266_RTOS_SDK中應(yīng)該怎么把ESP_LOGI重定向到UART1? 在Esp_log.h文件中找到 /** * @brief Set function used
    發(fā)表于 07-15 06:21

    管道風(fēng)速傳感器安裝要求標(biāo)準(zhǔn)

    傳感器的定義 管道風(fēng)速傳感器是一種利用物理或化學(xué)原理測(cè)量管道內(nèi)氣流速度的儀器。它能夠?qū)崟r(shí)監(jiān)測(cè)管道內(nèi)的風(fēng)速,為工業(yè)生產(chǎn)、環(huán)境保護(hù)、建筑通風(fēng)等領(lǐng)域提供重要的數(shù)據(jù)支持。 1.2
    的頭像 發(fā)表于 07-01 09:16 ?1626次閱讀

    管道風(fēng)速傳感器的安裝在管道的前端還是后端

    管道風(fēng)速傳感器是一種用于測(cè)量管道內(nèi)氣流速度的儀器,廣泛應(yīng)用于工業(yè)、農(nóng)業(yè)、環(huán)保、氣象等領(lǐng)域。在安裝管道風(fēng)速傳感器時(shí),需要考慮多種因素,以確保測(cè)量結(jié)果的準(zhǔn)確性和可靠性。本文將詳細(xì)介紹管道風(fēng)
    的頭像 發(fā)表于 07-01 09:14 ?1544次閱讀
    主站蜘蛛池模板: 国内黄色精品 | 成视频年人黄网站免费视频 | 国内精品久久影视免费 | 四虎影院免费在线播放 | 免费观看视频在线 | 国产精品久久久久久久久齐齐 | 午夜精品久久久久久久久 | 色综合久久综合欧美综合网 | 天天干天天干天天插 | 欧美1024 | 国模小丫大尺度啪啪人体 | 久久毛片视频 | a级毛片网站 | 精品少妇一区二区三区视频 | 男人天堂网在线播放 | 国产成人永久免费视频 | 亚洲黄色性视频 | 国产美女精品久久久久中文 | 国产天天色 | 欧美一卡二卡3卡4卡无卡六卡七卡科普 | 男人免费看片 | 天天在线精品视频在线观看 | 米奇精品一区二区三区 | 成人永久免费视频网站在线观看 | 天堂在线观看视频 | 日本又粗又长一进一出抽搐 | 男人午夜视频在线观看 | 亚洲一区在线播放 | 男女交黄 | 韩国韩宝贝2020vip福利视频 | 久久精品影视 | 97色涩 | 澳门色视频 | 萌白酱一线天粉嫩喷水在线观看 | 天堂va欧美ⅴa亚洲va一国产 | 五月婷六月婷婷 | 色偷偷888欧美精品久久久 | 午夜综合网 | 欧美操穴 | 四虎东方va私人影库在线观看 | 九九涩 |