MST

星途 面试题库

面试题:C语言通过popen执行命令并处理输出

使用`popen`函数编写一个C程序,执行`grep`命令查找特定字符串在文件中的出现次数,并将结果在控制台打印。同时阐述`popen`和`system`函数在使用场景和功能上的主要区别。
34.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

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 函数区别

  1. 返回值
    • popen:返回一个指向管道流的指针FILE*,通过这个指针可以读取或写入命令的输出或输入。如果调用失败,返回NULL
    • system:返回命令执行的退出状态。如果system调用失败(例如无法启动 shell),返回值是-1;如果成功启动 shell 并执行命令,返回值是 shell 执行命令后的退出状态。
  2. 功能
    • popen:用于执行一个命令,并将其标准输出或标准输入连接到一个管道,使得程序可以读取命令的输出(当模式为"r"时)或向命令输入数据(当模式为"w"时)。
    • system:用于执行一个 shell 命令,但它不提供对命令输入输出的直接操作。它只是简单地启动一个 shell 进程来执行命令,并且无法直接获取命令的输出内容(除非命令输出重定向到文件等方式间接获取)。
  3. 使用场景
    • popen:适用于需要与外部命令进行数据交互,例如获取命令的输出结果并在程序中进一步处理,或者向命令提供输入数据。比如需要解析命令的输出为特定格式的数据时。
    • system:适用于简单地执行一个 shell 命令,而不需要处理命令的输出或输入。例如执行一些系统管理命令,如创建目录、删除文件等不需要进一步处理输出的场景。