你的简历为什么总被HR忽略?

在Linux环境下,C语言可通过多种方式调用系统命令,核心方法包括system()popen()exec系列函数,以下是详细实现及安全实践:


system() 函数:简单执行命令

原理:直接调用系统的shell(如/bin/sh)执行命令,阻塞当前进程直到命令结束。
示例

int main() {
    int status = system("ls -l /home");  // 执行ls命令
    if (status == -1) {
        perror("system() failed");      // 错误处理
    }
    return 0;
}

特点

  • ✅ 优点:简单易用,支持管道和重定向(如ls | grep .txt)。
  • ❌ 缺点:存在安全风险(命令注入),效率低(需启动shell进程)。

popen() 函数:捕获命令输出

原理:创建管道连接命令的标准输入/输出,通过文件流读取结果。
示例(读取命令输出):

#include <stdio.h>
int main() {
    FILE *fp = popen("df -h", "r");  // 执行磁盘检查命令
    if (fp == NULL) {
        perror("popen() failed");
        return 1;
    }
    char buffer[256];
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        printf("%s", buffer);  // 逐行打印结果
    }
    pclose(fp);  // 关闭管道
    return 0;
}

特点

  • ✅ 优点:可获取命令输出,支持双向数据流(用"w"模式写入输入)。
  • ❌ 缺点:无法直接获取命令退出状态。

exec 系列 + fork():精细控制进程

原理:通过fork()创建子进程,在子进程中用exec替换为命令进程。
示例

#include <unistd.h>
#include <sys/wait.h>
int main() {
    pid_t pid = fork();
    if (pid == -1) {
        perror("fork() failed");
        exit(1);
    } else if (pid == 0) {  // 子进程
        execlp("ls", "ls", "-l", NULL);  // 执行ls -l
        perror("execlp() failed");       // 若exec失败才执行
        exit(1);
    } else {  // 父进程
        int status;
        waitpid(pid, &status, 0);  // 等待子进程结束
        if (WIFEXITED(status)) {
            printf("Exit code: %d\n", WEXITSTATUS(status));
        }
    }
    return 0;
}

常用exec函数

  • execlp("命令", "参数0", "参数1", ..., NULL):自动搜索PATH
  • execvp("命令", 参数数组):直接使用字符串数组

特点

  • ✅ 优点:无shell注入风险,可完全控制进程(如信号、资源)。
  • ❌ 缺点:代码较复杂,需手动处理进程管理。

方法对比与选型建议

方法 适用场景 安全性 效率
system() 快速测试、简单命令 低(需过滤输入)
popen() 需读取/写入命令数据流
exec+fork() 高性能、安全关键场景(如服务器)

安全注意事项

  • 命令注入防御
    避免使用system("user_input")形式,若需拼接命令:

    // 错误示例(危险!)
    system(strcat("rm ", user_input));  // 若user_input="; rm -rf /",将导致灾难
    // 正确做法:用exec直接传参
    execlp("rm", "rm", user_input, NULL);  // 参数会被安全处理
  • 输入验证:对用户输入进行白名单过滤(如只允许字母数字)。


  • 快速调用命令 → 用system()(需过滤输入)。
  • 获取命令输出 → 用popen()
  • 高性能、安全场景 → 用fork()+exec
  • 生产代码中优先选择exec系列,避免命令注入风险。

引用说明: 参考Linux手册页(man systemman popenman exec)、GNU C库文档及《Unix环境高级编程》(Advanced Programming in the UNIX Environment),具体函数行为以Linux系统实现为准。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/7562.html

(0)
酷番叔酷番叔
上一篇 2025年7月16日 22:48
下一篇 2025年7月16日 22:57

相关推荐

  • 关系型数据库与早期的数据库区别是什么,关系型数据库

    关系型数据库并非早期数据库的唯一形态,而是对网状、层次等早期模型进行结构化、标准化后的逻辑演进,其核心优势在于通过SQL实现数据的一致性与事务完整性,而早期数据库则更侧重于物理存储效率与特定场景的访问速度,数据库演进的历史脉络在理解现代关系型数据库之前,必须厘清“早期数据库”的定义,在20世纪60年代至70年代……

    2026年6月9日
    3500
  • 关系型数据库中行交什么操作?行级锁

    在关系型数据库中,“行”(Row)是构成数据表的基本逻辑单元,代表一条完整的实体记录,由多个垂直排列的“列”(Column)组成,是数据存取、索引构建及事务处理的最小业务粒度, 行数据的本质与物理存储机制要深入理解“行”,必须穿透SQL语法表象,直视其底层存储逻辑,在2026年的主流关系型数据库架构中,行并非简……

    2026年6月8日
    3300
  • 关系型数据库主键约束为何如此重要有何特点?数据库主键约束的作用是什么

    关系型数据库主键约束是确保数据表中每一行记录唯一且非空的强制机制,它是构建数据完整性、提升查询效率及维护参照完整性的核心基石,在2026年的企业级数据架构中,主键已不再仅仅是简单的ID标识,而是分布式事务一致性与微服务链路追踪的关键锚点,随着云原生数据库的普及,主键策略的选择直接决定了系统的扩展上限与运维成本……

    2026年6月7日
    3700
  • 网络行为隐私边界何在?法律道德如何平衡,网络隐私泄露怎么预防

    网络行为并非单纯的虚拟活动,而是受法律严格约束、受平台算法引导且直接影响个人数字资产与社会信用体系的现实行为,2026年核心趋势已从“流量至上”转向“合规与价值共生”,网络行为合规性的底层逻辑重构在2026年的数字生态中,网络行为的边界已发生根本性位移,过去被视为灰色地带的“数据抓取”、“隐私窥探”或“算法诱导……

    2026年6月17日
    3700
  • 国内最大智能交通展闭幕,智能交通展什么时候举办

    2026年国内最大智能交通展已圆满闭幕,本届展会不仅展示了车路云一体化从“试点”走向“规模化商用”的关键转折,更标志着中国智能交通行业正式进入以AI大模型驱动、数据要素流通为核心的深水区,为2027年行业落地提供了明确的技术路径与商业范式,展会核心洞察:技术范式的代际跃迁本次展会作为2026年行业风向标,其核心……

    2026年5月20日
    6700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信