c - 在函数内逐行读取和检查系统调用
问题描述
我正在我的主函数中运行一个系统调用,我想知道我是否可以在主函数中逐行读取系统调用的命令行输出。
我一直在网上寻找有关如何执行此操作的任何提示或想法,但我找不到任何提示或想法。需要注意的一点是,我不希望将输出写入文件然后从该文件中读取,而是逐行读取命令行输出。
int main(int argc, char const *argv[]) {
system("ls -al");
return 0;
}
比如上面的代码中,我想通过这个C函数打印当前目录下的所有文件。有了这些信息,我只想打印 4 月更新的那些(在第 6 列中以“Apr”区分)。我是否可以逐行读取输出,将行拆分为数组并检查指定的列是否为“Apr”,如果是,如何?任何和所有的帮助/建议将不胜感激。
解决方案
您可以使用 popen,如下所示:
#include <stdio.h>
int main()
{
FILE * fp = popen("ls -l", "r");
char buf[1024];
while (fgets(buf, 1024, fp)) {
printf("returned: \"%s\"\n", buf);
}
return 0;
}
这仅显示从命令中读取每一行,您仍然需要拆分文本以执行您想要的操作。
仅仅因为它很有趣,这里有一个从字符串缓冲区中抓取字段的简单函数:
char * get_field(char *buffer, int field)
{
int white = 1; // simple state machine
char *p;
char *first = NULL;
for (p=buffer; *p; p++) {
if (white) {
if (*p > ' ') {
white = 0;
first = p;
}
} else {
if (*p <= ' ') {
white = 1;
field--;
if (!field && first)
return strndup(first, p-first);
}
}
}
return NULL;
}
int main()
{
FILE * fp = popen("ls -l", "r");
char buf[1024];
while (fgets(buf, 1024, fp)) {
char *month = get_field(buf, 6);
if (month) {
printf(" month: \"%s\"\n", month);
free(month);
}
char *file = get_field(buf, 9);
if (file) {
printf(" file: \"%s\"\n", file);
free(file);
}
}
return 0;
}
这是一种简单的暴力破解方法,适用于简单的程序,并且不提供典型的 split() 函数的功能。但它说明了在 C 中做这种事情的一种方法。
推荐阅读
- python - 使用 TLS 的烧瓶应用程序
- sql - 如何仅在 oracle sql 中显示所有数字?
- python - 使用 memory_profiler 中的 %mprun 时未测量内存使用情况
- python - 为什么改组列表(范围(n))比改组[0] * n慢?
- julia - 在 Julia 中删除结构
- javascript - 依赖于从服务器返回的值的组件的提供程序
- laravel-nova - Laravel Nova 减少 Select 选项或注入子句进行查询
- python - 相同的 python 脚本可以在一台计算机上运行,但不能在另一台计算机上运行
- c - ncurses 无法在结构的 xy 位置显示元素
- csv - LOAD DATA INFILE 始终跳过第一行,但未设置为 IGNORE