Linux學習筆記24——進程管道

一 管道的作用

  通常把一個進程的輸出通過管道連接到另一個進程的輸入。

二 popen和pclose函數

#include <stdio.h>FILE *popen(const char *command,      //是要運行的程序名和相應的參數
       const
char *open_mode      //必須是“r”或者“w”,如果是其它值,errno將返回EINVAL
       );                 
int pclose(FILE *stream_to_close);     

  popen() 函數通過創建一個管道,調用 fork 產生一個子進程,執行一個 shell 以運行命令來開啟一個進程。

  pclose()調用只在popen啟動的進程結束后才返回,如果調用pclose函數時它仍在運行,pclose調用將等待該進程的結束。

例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>int main(){FILE *read_fp;          //要讀取的文件描述符char buffer[BUFSIZ+1];      //用來存儲讀到的文件信息int chars_read;          //實際讀取的元素個數memset(buffer,'\0',sizeof(buffer));    //將數組清零初始化read_fp=popen("cat test*.c | wc -l","r");  //創建管道,用于顯示所有test*.c文件的字數if(read_fp!=NULL){chars_read=fread(buffer,sizeof(char),BUFSIZ,read_fp);//從一個文件流中讀數據,最多讀取count個元素,每個元素size字節,如果調用成功返回實際讀取到的元素個數,如果不成功返回 0while(chars_read>0){buffer[chars_read-1]='\0';      //清除回車符printf("Reading:-\n %s\n",buffer);chars_read=fread(buffer,sizeof(char),BUFSIZ,read_fp);}pclose(read_fp);        //關閉管道exit(EXIT_SUCCESS);}exit(EXIT_FAILURE);
}

  使用shell的一個不太好的影響:針對每個popen調用,不僅要啟動一個被請求的程序,還要啟動一個shell,即每個popen調用將多啟動兩個進程。從節省系統資源的角度來看,popen函數的調用成本略高,而且對目標命令的調用比正常方式要慢一些。

三 pipe函數

#include <unistd.h>
int pipe(int fd[2]);

  pipe函數的參數是一個由兩個整數類型的文件描述符組成的數組的指針,兩個返回的文件描述符以一種特殊的方式連接起來,寫到fd[1]的所有數據都可以從fd[0]讀回來,數據基于先進先出的原則(FIFO)進程處理。

  對一個已關閉寫數據的管道做read調用將返回0而不是阻塞,讀取無效的文件描述符將看作是一個錯誤并返回-1
?
  如果跨越fork調用使用管道,就會有兩個不同的文件描述符可以用于向管道寫數據,一個在父進程中,一個在子進程中。只有把父子進程中的針對管道的寫文件描述符都關閉,管道才會被認為是關閉了,對管道的read調用才會失敗。

管道的讀寫規則:

  1 從管道中讀取數據

  • 如果管道的寫端不存在,則認為已經讀到了數據的末尾,讀函數返回的讀出字節數為0;
  • 當管道的寫端存在時,如果請求的字節數目大于PIPE_BUF,則返回管道中現有的數據字節數,如果請求的字節數目不大于 PIPE_BUF,則返回管道中現有數據字節數(此時,管道中數據量小于請求的數據量);或者返回請求的字節數(此時,管道中數據量不小于請求的數據 量)。注:(PIPE_BUF在include/linux/limits.h中定義,不同的內核版本可能會有所不同。Posix.1要求 PIPE_BUF至少為512字節,red hat 7.2中為4096)。

  2 從管道中寫入數據

  向管道中寫入數據時,linux將不保證寫入的原子性,管道緩沖區一有空閑區域,寫進程就會試圖向管道寫入數據。如果讀進程不讀走管道緩沖區中的數據,那么寫操作將一直阻塞。
  注:只有在管道的讀端存在時,向管道中寫入數據才有意義。否則,向管道中寫入數據的進程將收到內核傳來的SIFPIPE信號,應用程序可以處理該信號,也可以忽略(默認動作則是應用程序終止)。

?

例子:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>int main(){const char some_data[]="123";int file_pipes[2];int data_processed;pid_t fork_result;if(pipe(file_pipes)==0){fork_result=fork();if(fork_result==(pid_t)-1){fprintf(stderr,"Fork failure");exit(EXIT_FAILURE);}if(fork_result==0){      //子進程close(0);          //關閉標準輸入,即鍵盤輸入dup(file_pipes[0]);    //復制一個文件描述符close(file_pipes[0]);   ?//關閉讀操作close(file_pipes[1]);   //關閉寫操作execlp("od","od","-c",(char*)0);  //利用od查看特殊格式的文件內容,-c表示ASCII字符或反斜杠序列,(char*)0參數作用是終止被調用程序的參數列表exit(EXIT_FAILURE);}else{     //主進程close(file_pipes[0]);  data_processed=write(file_pipes[1],some_data,strlen(some_data));  //寫入數據close(file_pipes[1]);printf("%d - wrote %d bytes\n",getpid(),data_processed);}}exit(EXIT_SUCCESS);
}

?

?

?

  

轉載于:https://www.cnblogs.com/zjzsky/p/3518604.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386280.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386280.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386280.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

耗時兩個禮拜,8000字安卓面試長文,建議收藏

本專欄專注分享大型Bat面試知識&#xff0c;后續會持續更新&#xff0c;喜歡的話麻煩點擊一個關注 面試官: ButterKnife為什么執行效率為什么比其他注入框架高&#xff1f;它的原理是什么 心理分析&#xff1a; ButterKnife框架一直都是使用&#xff0c;很少又開發者對butterkn…

VS2010常用快捷鍵

1、自動排版 編輯.格式化選定內容 Ctrl K&#xff0c;Ctrl F(form)根據周圍的代碼行&#xff0c;正確縮進選定的代碼行。 2、注釋與去掉注釋功能。 編輯.注釋選定內容 Ctrl K&#xff0c;Ctrl C(comment) 使用編程語言的正確注釋語法將代碼的當前行標記為注釋。 編輯.取消注…

騰訊+字節+阿里面經真題匯總,Android篇

簡介 首先&#xff0c;Android是不是真的找工作越來越難呢&#xff1f;這個可能是大家最關心的。這個受大的經濟環境以及行業發展前景的影響&#xff0c;同時也和個人因素有關。 近期一方面是所在的公司招聘Java開發人員很難招到合適的&#xff0c;投簡歷的人很少&#xff1b;…

border-image圖片邊框

一、border-image的兼容性 1、支持到IE11以上&#xff0c;其他主要瀏覽器均支持 2、使用webkit以后支持android4.3以上 二、border-image的參數&#xff08;包括圖片、裁剪位置、重復性&#xff09; 1、圖片&#xff08;border-image-source&#xff09;采用url&#xff08;&am…

騰訊3輪面試都問了Android事件分發,原理+實戰+視頻+源碼

一、架構師專題 想要掌握復雜的技術&#xff0c;必須要理解其原理和架構。本模塊結合實際一線互聯網大型項目理解架構思維&#xff0c;抽絲剝繭&#xff0c;層層深入&#xff0c;幫助大家成為Android架構師&#xff0c;在思想上對架構認識有一次升華&#xff0c;并知其所以然&a…

Java自學筆記(16):常用類:Math,Data和Calender,Format,Scanner

Math類 位于java.lang包&#xff0c;主要用于基本的算術運算&#xff0c;包含的成員都是靜態的&#xff0c;可以直接調用 兩個常量&#xff1a;PI&#xff0c;E 方法&#xff1a; sin(double a) 返回角的三角正弦。 cos(double a) 返回角的三角余弦。 tan(double a) 返回角的三…

熬夜肝完這份Framework筆記,已拿到offer

第一次觀看我文章的朋友&#xff0c;可以關注、點贊、轉發一下&#xff0c;每天分享各種干貨技術和程序猿趣事 前言 隨著移動終端的快速發展&#xff0c;Android開發人員也越來越多&#xff0c;Android開發市場也進入了一個飽和的狀態&#xff0c;Android開發人員也面臨著難找…

[LoadRunner]UTF8字符格式

前一編說到xmlrpc調用操作&#xff0c;由于有時候在xmlrpc里有中文字符的請求&#xff0c;但由于上傳的請求與服務器的編碼不匹配&#xff0c;會導致請求不成功。 那么我們就需要把服務端的編碼與客戶端的編碼統一&#xff0c;這里說一下uft8中文字符轉換 int XmlBody() {char …

現在做Android開發有前途嗎?復習指南

背景 知乎客戶端中有一個自己維護的 Hybrid 框架&#xff0c;在此基礎上開發了一些 Hybrid 頁面&#xff0c;當需要前端或者客戶端開發接口的時候&#xff0c;就涉及到聯調的問題。 和一般的 前端 <> 服務端&#xff0c;或者 客戶端 <> 服務端 類似&#xff0c;前…

TreeSet

/*Set : 無序&#xff0c;不可以重復元素|--HashSet:數據結構是哈希表&#xff0c;線程是非同步的保證元素唯一性原理&#xff1a; 判斷元素的HashCode值是否相同如果相同&#xff0c;還會繼續判斷元素的equals方法是否為True|TreeSet: 可以對集合中的元素進行排序底層數據結構…

現在做Android開發有前途嗎?社招面試心得

開頭 面試時間&#xff1a;2021.2.9 1~3面、2021.2.13 4~6面、2021.2.26 HR面 面試部門 崗位&#xff1a;商業化 - 高級 Android 開發工程師 面試感想&#xff1a;整體面得比較累&#xff0c;基礎面、交叉面、Boss面&#xff0c;前前后后對接了 6 個面試官 (離當初給我說的 3面…

現在做Android開發有前途嗎?附面試題答案

開頭 籠統來說&#xff0c;中年程序員容易被淘汰的原因其實不外乎三點。 1、輸出能力已到頂點。這個人奮斗十來年了&#xff0c;依舊碌碌無為&#xff0c;很明顯這人的天花板就這樣了&#xff0c;說白了&#xff0c;天賦就這樣。 2、適應能力越來越差。年紀大&#xff0c;有家…

C++開發WPF,Step by Step

C開發WPF&#xff0c;Step by Step 示例代碼 使用C來開發WPF&#xff0c;主要是如何在MFC&#xff08;Win32&#xff09;的窗口中Host WPF的Page。下面我就做個詳細的介紹. 一、創建工程, 由于MFC的Wizard會生成很多用不到的代碼&#xff0c;所以我準備從一個空的工程開始創建一…

C#學習之unsafe

為了保持類型安 全&#xff0c;默認情況下&#xff0c;C# 不支持指針算法。 不過&#xff0c;通過使用 unsafe 關鍵字&#xff0c;可以定義可使用指針的不安全上下文。 unsafe 在C# 程 序中的使用場合&#xff1a; 1&#xff09;實時應用&#xff0c;采用指針來提高性能&…

百度、華為、京東、B站最新面試題匯集,實戰篇

前言 回顧一下自己這段時間的經歷&#xff0c;因公司突然通知裁員&#xff0c;我匆匆忙忙地出去面了幾家&#xff0c;但最終都沒有拿到offer&#xff0c;我感覺今年的寒冬有點冷。公司開始第二波裁員&#xff0c;我決定主動拿賠償走人。后續的面試過程我做了一些準備&#xff…

php 常用正則運算

$regx "/^[0-9]*$/"; var_dump(preg_match($regx, $phone));常用的正則運算&#xff1a; ?驗證數字&#xff1a;^[0-9]*$ ?驗證n位的數字&#xff1a;^\d{n}$ ?驗證至少n位數字&#xff1a;^\d{n,}$ ?驗證m-n位的數字&#xff1a;^\d{m,n}$ ?驗證零和非零開頭的…

百度、阿里、滴滴、新浪的面試心經總結,一線互聯網公司面經總結

開頭 技術的發展產生了程序員這個職位&#xff0c;從這些年各大互聯網公司曝光的一些員工收入水平來看&#xff0c;程序員的工資還是相對比較高的&#xff0c;可是我們在互聯網上還聽到了另外一種聲音&#xff0c;很多程序員想轉行&#xff0c;特別是大齡程序員&#xff0c;這…

go build編譯不同環境

#usage: go build [-o output] [-i] [build flags] [packages] go build的使用比較簡潔&#xff0c;所有的參數都可以忽略&#xff0c;直到只有go build&#xff0c;這個時候意味著使用當前目錄進行編譯&#xff0c;下面的幾條命令是等價的&#xff1a; go buildgo build .go b…

百度、阿里、滴滴、新浪的面試心經總結,源碼+原理+手寫框架

前言 作為一個程序員&#xff0c;如果你在新知識、新技術面前仍一無所知&#xff0c;依然吃著十多年前的老本&#xff0c;那你在知識技術上肯定落伍&#xff0c;如果又未能進入管理層面&#xff0c;那你肯定就會被長江的后浪拍在沙灘上了。 而不少與時俱進、善于學習的程序員…

LINQ to SQL

Moved to http://blog.tangcs.com/2008/10/06/linq-to-sql/轉載于:https://www.cnblogs.com/WarrenTang/archive/2008/10/06/1304727.html