You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言execlp调用中实现Linux终端命令管道效果,无需使用pipe函数

无需调用C原生pipe函数实现exec管道逻辑的方案

需求说明

开发C语言终端应用校验文件扩展名与真实类型是否匹配,调用file命令识别文件类型后,需要将输出空格替换为井号、切割指定列提取真实扩展名,避免手动调用C语言pipe系统调用实现管道逻辑。

当前实现现状

现有调用file命令的代码:

execlp("file", "file", (char *)args.file_arg[i], NULL)

输出示例:

EI_PA.1S2021-22.proj_checkFile---v2.pdf: PDF document, version 1.7

实现方案

直接调用shell执行拼接管道命令

exec系列函数可以直接调用shell解释器,将完整管道逻辑作为参数传入,所有管道处理由shell完成,无需手动操作C原生pipe函数:

char cmd_buf[1024];
// 逻辑为调用file命令 → 空格替换为# → 按#切割取第2列获取文件类型,可根据需要调整切割列号
snprintf(cmd_buf, sizeof(cmd_buf), "file \"%s\" | tr ' ' '#' | cut -d'#' -f2", args.file_arg[i]);
execlp("sh", "sh", "-c", cmd_buf, NULL);

注:%s外层加引号是为了兼容带空格、特殊字符的文件名。

若需要在C代码中获取处理后的结果

使用popen函数即可,该函数内部已经封装了pipe、fork、exec的全套逻辑,仍不需要手动调用原生pipe:

FILE *fp = popen(cmd_buf, "r");
char res_buf[256];
if (fp) {
    if (fgets(res_buf, sizeof(res_buf), fp) != NULL) {
        // res_buf中即为提取到的真实文件类型
    }
    pclose(fp);
}

内容的提问来源于stack exchange,提问作者Diogo Alpendre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:57:04