91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

Linux愛好者 ? 來源:TOMORROW ? 作者:TOMORROW ? 2020-12-11 16:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

對shell有一定了解的人都知道,管道和重定向是 Linux 中非常實用的 IPC 機制。

在shell中,我們通常使用符合‘|’來表示管道,符號‘>’和‘<’表示重定向。

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

管道

管道的定義

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

它是半雙工運作的,想要同時雙向傳輸需要使用兩個管道。

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

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

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

所以需要使用兩個文件描述符來索引它,一個表示讀端,一個表示寫端。

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

創(chuàng)建管道

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

int fd[2]; pipe(fd);

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

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

把管道作為標準輸入輸出

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

而因為shell中都是使用標準輸入輸出對管道進行讀寫的,例如ls | grep main.c就是將 ls 的標準輸出寫到了管道寫端,而 grep 的標準輸入則從管道讀端讀取,所以本文也只描述此方法。

示例代碼如下:

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)建一個管道,然后創(chuàng)建子進程,子進程會繼承這一個管道,也就保證了父進程與子進程操作的是同一個管道(管道的繼承與普通變量不同)。

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

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

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

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

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

調(diào)用dup2(fd[0],0),實際上就是將文件描述符 3 指向的文件表項賦值給了文件描述符 0,而文件描述符 0 正是進程默認的標準輸入。

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

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

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

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

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

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

文件重定向

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

實例代碼如下:

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

以上兩行簡單的代碼就實現(xiàn)了,將該進程的標準輸出重定向到了文件 out.txt ,甚至一行就可以實現(xiàn)。

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

而將進程的標準輸入重定向到文件 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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

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

    關(guān)注

    3

    文章

    148

    瀏覽量

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

    關(guān)注

    30

    文章

    4968

    瀏覽量

    74011

原文標題:Shell:管道與重定向

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

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

    【乾芯QXS320F開發(fā)板試用】基于printf重定向的高速串口調(diào)試方案

    。 二、代碼分析 核心代碼的邏輯是通過重定向(Retarget) C語言標準庫的 printf 和 puts 函數(shù),使得原本輸出到控制臺的內(nèi)容,改由芯片的物理串口(SCI)發(fā)出。這一點以前做過
    發(fā)表于 01-07 17:30

    Linux中13個基本Cat命令示例

    進行排序 這將創(chuàng)建一個文件test4和輸出cat命令通過管道進行排序,結(jié)果將在新創(chuàng)建的文件中重定向。 # cat test test1 test2 test3 | sort > test4
    發(fā)表于 12-26 06:09

    【瑞薩RA6E2地奇星開發(fā)板試用】串口通信報錯:標準輸出流 stdout 未定義

    在跟著官方串口通信報錯: 問題可能是: 使用了 printf 或類似標準庫函數(shù) 但未實現(xiàn)重定向到串口所需的基礎(chǔ)設(shè)施 LLVM 工具鏈(Clang/LD)無法找到 stdout 的定義 已知在
    發(fā)表于 12-17 18:39

    TI Driverlib 標準輸出完整重定向的改進方案

    探索出了一種用于TI Driverlib的完整輸出重定向方案
    的頭像 發(fā)表于 11-11 00:33 ?472次閱讀

    UART在5.2.0版本E2S中的重定向

    隨著FSP庫版本更新到5.2.0,在開發(fā)過程中就會發(fā)現(xiàn)4.0.0版本的串口重定義并不適用于最新版本。繼續(xù)使用原來的重定向代碼時,編譯器就會報錯。根據(jù)報錯的信息發(fā)現(xiàn),缺少了幾個函數(shù)的定義,這里補全
    的頭像 發(fā)表于 10-31 15:28 ?4021次閱讀
    UART在5.2.0版本E2S中的<b class='flag-5'>重定向</b>

    管道運輸中的傳感器:管道狀態(tài)監(jiān)測

    在現(xiàn)代工業(yè)體系中,管道運輸承擔(dān)著不可或缺的重任,無論是石油、天然氣等能源的長距離輸送,還是化工原料在不同生產(chǎn)環(huán)節(jié)的流轉(zhuǎn),管道運輸都憑借其高效、連續(xù)、低成本的優(yōu)勢,成為工業(yè)生產(chǎn)和能源供應(yīng)的關(guān)鍵環(huán)節(jié)。
    的頭像 發(fā)表于 09-05 16:10 ?540次閱讀

    【RA4E2開發(fā)板評測】FSP5.2之后的串口重定向問題解決方法

    【緣由】 我在導(dǎo)入RA4E2的UART工程時遇到編譯報錯,提示如下: 原因是隨著FSP庫版本更新到5.2.0,在開發(fā)過程中就會發(fā)現(xiàn)4.0.0版本的串口重定義并不適用于最新版本。繼續(xù)使用原來的重定向
    發(fā)表于 08-29 07:02

    MEMS定向短節(jié)可以為水平定向鉆機提供哪些數(shù)據(jù)?

    水平定向鉆機是在不開挖地表面的條件下,鋪設(shè)多種地下公用設(shè)施(管道、電纜等)的一種施工機械,廣泛應(yīng)用于供水、電力、電訊等管線鋪設(shè)施工中。MEMS定向短節(jié)ER-MNS-09作為水平定向鉆機
    的頭像 發(fā)表于 07-24 14:10 ?505次閱讀

    20205新疆國際煤博會:礦用尋北儀提供高可靠定向解決方案

    2025新疆國際煤炭工業(yè)博覽會的收官之日,我們的MEMS尋北儀與定向短節(jié)受到一致好評,專為復(fù)雜工業(yè)場景打造,尤其適用于煤炭井下定向掘進、鉆探軌跡控制等關(guān)鍵環(huán)節(jié),重新定義尋北技術(shù)標準!
    的頭像 發(fā)表于 07-18 15:43 ?616次閱讀
    20205新疆國際煤博會:礦用尋北儀提供高可靠<b class='flag-5'>定向</b>解決方案

    MEMS定向短節(jié)在HDD中如何精準定向

    ? 水平定向鉆孔作業(yè)時,常規(guī)傳感器在強電磁區(qū)等復(fù)雜環(huán)境中常常面臨地磁場失效導(dǎo)致方位基準崩塌、劇烈震動與沖擊破壞姿態(tài)測量、空間限制傳感器集成等一系列精度挑戰(zhàn),ER-MNS-09(下文稱為“09”)這款
    的頭像 發(fā)表于 07-08 14:46 ?530次閱讀

    MEMS陀螺工具定向短節(jié)全面升級,重新定義測量標準

    在石油天然氣測井、物探、定向鉆孔等領(lǐng)域,井下軌跡測量始終面臨三大挑戰(zhàn):磁場干擾環(huán)境下的方位精度衰減,振動工況下需停鉆測量以及小井斜工況下的測量盲區(qū)。今天,ER-Gyro-15 MEMS 陀螺工具定向
    的頭像 發(fā)表于 07-01 14:58 ?1472次閱讀
    MEMS陀螺工具<b class='flag-5'>定向</b>短節(jié)全面升級,重新<b class='flag-5'>定義</b>測量標準

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

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

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

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

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

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

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

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