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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

Linux愛好者 ? 來源:TOMORROW ? 作者:TOMORROW ? 2020-12-11 16:26 ? 次閱讀

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

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

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

管道

管道的定義

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

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

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

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

管道的本質是內存中的緩沖區,可以看作是打開到內存中的文件。

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

并且規定,數據只能從讀端讀取、只能往寫端寫入。

創建管道

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

int fd[2]; pipe(fd);

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

至此管道就算創建成功了。

把管道作為標準輸入輸出

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

而因為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); }

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

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

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

文件描述符,本質是非負整數,通常是小整數;它是一個索引,通過該索引可以找到對應的文件。

例如,標準輸入、標準輸出、標準錯誤的文件描述符默認是 0、1、2 。當進程需要從標準輸入中讀取數據時,就會通過 0 索引找到標準輸入所對應的內存緩沖區來讀取數據。

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

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

所以此時,當進程需要從標準輸入讀取數據時,進程就會通過文件描述符 0 來找到管道讀端所對應內存緩沖區。

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

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

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

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

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

文件重定向

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

實例代碼如下:

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

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

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

而將進程的標準輸入重定向到文件 in.txt 的代碼如下:

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

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

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

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

責任編輯:lq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4350

    瀏覽量

    63084
  • 管道
    +關注

    關注

    3

    文章

    145

    瀏覽量

    18038
  • 代碼
    +關注

    關注

    30

    文章

    4844

    瀏覽量

    69234

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

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

收藏 人收藏

    評論

    相關推薦

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

    視作整體,分開沒有單獨的含義 順序問題: find /etc -name .bashrc > list 2>1 > list 這個是從左到右有順序的 第一種 xxx > list 2>1 > list 先將要輸出到 stderr 的內容重定向到 stdout ,此時會產
    的頭像 發表于 01-08 10:19 ?249次閱讀

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

    shell腳本編寫之輸入輸出重定向shell輸出重定向通常是指將執行命令的輸出信息從默認的標準輸出(即當前終端)重新定向到指定文件中。輸入重定向通常是指將命令所需的輸入數據的來源,從標
    發表于 09-24 10:06

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

    shell輸出重定向通常是指將執行命令的輸出信息從默認的標準輸出(即當前終端)重新定向到指定文件中。輸入重定向通常是指將命令所需的輸入數據的來源,從標準輸入(即當前終端)更改為從指定文件中獲取。輸出
    發表于 09-23 10:23

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

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

    在ESP8266_RTOS_SDK中應該怎么把ESP_LOGI重定向到UART1?

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

    esp32c3能不能將串口打印函數重定向到自己軟件模擬的uart上?

    模擬uart,用于打印日志;請問這種做法可以實現嗎?可以將打印函數重定向到該模擬uart嗎?如果可以,麻煩指導一下重定向需要修改哪幾個函數? ps:打印的函數主要涉及到printf
    發表于 06-20 06:32

    請問ESP32C3如何重定向控制臺串口?

    軟件環境:esp-idf v4.4 硬件環境:esp32c3 問題描述:需要將控制臺輸出重定向到 UART1(RX: GPIO4,TX:GPIO5),UART0 用來做上下位機通信。 按照這個鏈接
    發表于 06-07 08:12

    請問如何將printf使用的stdout重定向到asclin?

    /v4.9.3.0-infineon-1.0/docs/userguide.pdf 第 406 頁中關于 printf 的唯一說明是 stdout 重定向到模擬 io 調試器。 當然,您可以使用 Ifx_Console_print,但我想知道是否可以通過標準庫來實現。
    發表于 06-03 06:48

    芯海通用 MCU 應用筆記:在 MDK 開發環境下代碼重定向到 RAM 執行的幾種方法

    空間并寫入新的代碼。此外還具備執行效率高,壽命長優點。 本文檔介紹和說明在 MDK 開發環境下將代碼重定向到 RAM 中執行的方法。本文檔使用開發環境位 keil UVision,版本號
    發表于 05-16 11:58

    芯海通用 MCU應用筆記 :在 IAR 及 MDK 開發環境下使用 printf 函數重定向移植差異指南

    對 printf 函數支持的差異。并在本應用筆記結尾處給出可以一鍵移植到 Keil、IAR8.x、IAR9.x 版本下的通用重定向代碼。 Keil 和 IAR 都是常用的開發工具 IDE,在實際項目開發
    發表于 05-16 11:56

    求助,關于HAL下的printf重定向輸出疑問求解

    (1)網上查了使用printf重定向,串口輸出,函數如下,使用HAL_UART_Transmit函數。 int fputc(int ch,FILE *f) { uint8_t temp[1
    發表于 05-10 06:04

    STM8S如何在STVD環境下重定向printf函數實現UART簡化輸出?

    1. AS the title, who can share your code in STVD?NOT in IAR,,,thanks a lot. 2. 目前困在STVD環境下,不能重定向
    發表于 04-30 08:29

    STM8L051片子使用重定向printf函數時總是報錯,沒辦法引用printf函數是什么原因?

    STM8L051片子使用重定向printf函數時總是報錯,沒辦法引用printf函數,不知道是什么原因,使用的是IAR編譯器,總是報內存不足的錯誤,,求大神指導
    發表于 04-28 08:05

    STM32CubeIDE中打印重定向報錯怎么解決?

    HAL_UART_Transmit( huart1 , (uint8_t *) ch, 1, 0xFFFF);報錯 printf重定向 報錯../Core/Src/main.c:42:21: error: \'huart1\' undeclared 已添加stdio.h頭文件。
    發表于 04-03 07:33

    H7平臺如何重定向sqrtf函數到RAM中運行?

    如題,H7平臺如何重定向sqrtf函數到RAM中運行,這個函數是庫函數,不能使用__ramfunc前綴,有什么方法或是例程,網上找了很多icf配置的方法,都不行,要不就是只放置到RAM地址,不能程序
    發表于 03-27 06:40
    主站蜘蛛池模板: 欧美zooz人与禽交 | 亚洲乱码卡一卡二卡三永久 | 777午夜精品免费播放 | 国产特黄一级片 | 乌克兰毛片| 美女毛片视频 | 丁香婷婷基地 | 把小嫩嫩曰出白浆 | 天天干视频网站 | 五月婷婷激情综合 | 四虎永久精品免费观看 | 天天操伊人 | 精品国产免费观看一区高清 | 黄视频网站观看 | 黄色片网站观看 | 3p性小说 | 四虎国产永久在线精品免费观看 | 美女好紧好大好爽12p | 人人草人人 | 在线观看亚洲成人 | 呦交小u女国产秘密入口 | 欧美激欧美啪啪片免费看 | 成人午夜在线观看国产 | 特一级黄色片 | 狠狠色丁香久久综合婷婷 | 久久9966精品国产免费 | 在线视频网址 | 五月天婷婷久久 | 激情五月深爱五月 | 4hu四虎永久免在线视 | 26uuu另类亚洲欧美日本一 | 男人的天堂一区二区视频在线观看 | 天天干天天射天天爽 | 色视频在线免费看 | 免费视频亚洲 | 男操女视频网站 | 最近最新中文字幕6页 | 两性色午夜视频免费国产 | 美女毛片免费看 | 四虎网站最新网址 | 美女和帅哥在床上玩的不可描述 |