女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

    文章

    4369

    瀏覽量

    64191
  • 管道
    +關注

    關注

    3

    文章

    146

    瀏覽量

    18156
  • 代碼
    +關注

    關注

    30

    文章

    4886

    瀏覽量

    70253

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    請問CYPD2119可以開發自定義固件嗎?

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

    STM32CubeIDE STM32H743XIH6串口無法重定向,且發送內容波特率不對亂碼怎么解決?

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

    智慧路燈的定向廣播功能:技術與應用的完美融合

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

    DeepSeek獲殊榮,成為ai.com重定向官網

    近日,記者發現,在瀏覽器中輸入“ai.com”這一頂級域名時,頁面將直接重定向至DeepSeek的官方網站。這一變化引起了業界的廣泛關注,標志著DeepSeek在人工智能領域的地位得到了高度認可
    的頭像 發表于 02-11 15:41 ?458次閱讀

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

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

    DAC5681Z芯片elay range是什么含義

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

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

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

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

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

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

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

    重定向了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

    管道風速傳感器安裝要求標準

    傳感器的定義 管道風速傳感器是一種利用物理或化學原理測量管道內氣流速度的儀器。它能夠實時監測管道內的風速,為工業生產、環境保護、建筑通風等領域提供重要的數據支持。 1.2
    的頭像 發表于 07-01 09:16 ?1571次閱讀

    管道風速傳感器的安裝在管道的前端還是后端

    管道風速傳感器是一種用于測量管道內氣流速度的儀器,廣泛應用于工業、農業、環保、氣象等領域。在安裝管道風速傳感器時,需要考慮多種因素,以確保測量結果的準確性和可靠性。本文將詳細介紹管道
    的頭像 發表于 07-01 09:14 ?1483次閱讀

    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