C 程序实现
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp;
char buffer[1024];
char command[256];
const char *filename = "your_file.txt";
const char *search_string = "your_search_string";
// 构建 grep 命令
snprintf(command, sizeof(command), "grep -c %s %s", search_string, filename);
// 使用 popen 执行命令
fp = popen(command, "r");
if (fp == NULL) {
perror("popen");
return 1;
}
// 读取命令输出
if (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("出现次数: %s", buffer);
}
// 关闭管道
pclose(fp);
return 0;
}
popen 和 system 函数区别
- 返回值:
popen
:返回一个指向管道流的指针FILE*
,通过这个指针可以读取或写入命令的输出或输入。如果调用失败,返回NULL
。
system
:返回命令执行的退出状态。如果system
调用失败(例如无法启动 shell),返回值是-1
;如果成功启动 shell 并执行命令,返回值是 shell 执行命令后的退出状态。
- 功能:
popen
:用于执行一个命令,并将其标准输出或标准输入连接到一个管道,使得程序可以读取命令的输出(当模式为"r"
时)或向命令输入数据(当模式为"w"
时)。
system
:用于执行一个 shell 命令,但它不提供对命令输入输出的直接操作。它只是简单地启动一个 shell 进程来执行命令,并且无法直接获取命令的输出内容(除非命令输出重定向到文件等方式间接获取)。
- 使用场景:
popen
:适用于需要与外部命令进行数据交互,例如获取命令的输出结果并在程序中进一步处理,或者向命令提供输入数据。比如需要解析命令的输出为特定格式的数据时。
system
:适用于简单地执行一个 shell 命令,而不需要处理命令的输出或输入。例如执行一些系统管理命令,如创建目录、删除文件等不需要进一步处理输出的场景。