在#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相关命令有关的一些操作...