在#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函數其實是對管道操作的一些包裝,所完成的工作有以下幾步:
- 創建一個管道。
- fork 一個子進程。
- 在父子進程中關閉不需要的文件描述符。
- 執行 exec 函數族調用。
- 執行函數中所指定的命令。
具體用法如下:在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相關命令有關的一些操作...