#Linux#進程間通信# 管道(pipe)-標準流管道pipe

#Linux#進程間通信# 管道(pipe)-普通管道pipe中,我們很容易可以看出普通管道一是單工,即只能單向傳輸,而標準流管道針對匿名管道PIPE一系列封裝。返回文件流。只不過返回的文件流無法使用遊標/偏移量(offset)相關函數,如lseek等

標準流管道帶有緩衝區,函數如下:

FILE* popen(char* command ,char* type);

command:指向的是一個以 null 結束符結尾的字符串,這個字符串包含一個 shell 命令,並被送到/bin/sh 以-c 參數執行,即由 shell 來執行;

type:表示的是讀寫方式,只能是其中一種方式,不能讀寫同時進行。

  • ”r”: 文件指針連接到 command 的標準輸出
  • “w” :文件指針連接到 command 的標準輸入
int pclose(FILE* stream);

stream:要關閉的文件流。

 

popen函數其實是對管道操作的一些包裝,所完成的工作有以下幾步:

  1. 創建一個管道。
  2. fork 一個子進程。
  3. 在父子進程中關閉不需要的文件描述符。
  4. 執行 exec 函數族調用。
  5. 執行函數中所指定的命令。

 

具體用法如下:在shell中運行命令dmesg | grep "WARNING:" | wc -l, 並且將結果內容讀取到當前進程的文件流f中。

int get_warnings_count(void)
{
	int warnings;
	FILE *f;

	f = popen("dmesg | grep \"WARNING:\" | wc -l", "r");
	fscanf(f, "%d", &warnings);
	fclose(f);

	return warnings;
}

因此,可見標準流管道一般用於與shell相關命令有關的一些操作...

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章