如何在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
相关产品推荐
相关产品推荐

