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

发布了170 篇原创文章 · 获赞 207 · 访问量 459万+

猜你喜欢

转载自blog.csdn.net/xiaoting451292510/article/details/103730980