Linux学习_exec和system函数
发布日期:2021-05-14 23:43:02 浏览次数:16 分类:精选文章

本文共 3131 字,大约阅读时间需要 10 分钟。

分析 exec 函数和 system 函数

exec 函数

1. 概念

exec 函数是一种用以替代当前进程正文、数据堆和栈的函数。当调用 exec 时,当前进程会被新程序完全替代,新程序从 main 函数开始执行。exec 函数并不创建新进程,而是以另一个程序替换当前进程的代码和相关结构。

2. 函数原型

以下是 exec 系列函数的原型:

#include 
int execl(const char *pathname, const char *arg0, ... /*(char*)0*/);int execv(const char *pathname, char *const argv[]);int execle(const char *pathname, const char *arg0, ..., char *const envp[]);int execve(const char *pathname, char *const argv[], char *const envp[]);int execlp(const char *pathname, const char *arg0, ..., /*(char*)0*/);int execvp(const char *pathname, char *const argv[]);

3. 注意事项

  • 参数类型

    • execlp 和 execvp 函数的 pathname 参数可以是相对路径或绝对路径。
    • 其他函数的 pathname 参数必须为绝对路径
  • 参数传递

    • argv 参数是新程序要传递的参数列表,最后一个参数必须是 NULL。
    • envp 参数是进程的环境表。
  • 函数类型

    • execve 是系统调用,其他函数是库函数
  • 函数特点

    • exec 系列函数用于替代当前进程的正文,以下子进程的代码将不会执行。
  • exec 函数的区别

    选项 含义 示例
    l 列表参数传递 exec "/bin/ls", "file.txt"
    p 路径参数可以是相对路径 execp "/usr/bin/ls", "file.txt"
    v 通过数组传递参数列表 execv "/bin/ls", {"file.txt", NULL}
    e 自定义环境变量传递 exele "/bin/ls", "file.txt", {"PATH=/bin_SOFT", "LD_LIBRARY_PATH=..."}
    _后缀 无特定意义,仅用于区分函数 exec "$0" "$Akka"

    4. 示例

    以下是使用 exec 函数创建子进程并执行新程序的示例:

    #include 
    #include
    #include
    #include
    char *cmd1 = "./fgetc练习";char *cmd2 = "./1_sushu";char *argv1 = "test.txt";int main(int argc, char **argv) { pid_t pid; // 创建第一个子进程 if ((pid = fork()) < 0) { perror("fork error"); exit(1); } else if (pid == 0) { if (execlp(cmd1, cmd1, argv1, NULL) < 0) { perror("execl error"); exit(1); } // 子进程被 new程序替代,后续代码不会执行 } sleep(1); // 创建第二个子进程 if ((pid = fork()) < 0) { perror("fork error"); exit(1); } else if (pid == 0) { char *argv[7] = {cmd2, "1", "2", "3", "4", "5", NULL}; if (execvp(cmd2, argv) < 0) { perror("execl error"); exit(1); } } // 等待子进程完成 wait(NULL); printf("-----------------------------------------\n"); return 0;}

    system 函数

    1. 函数原型

    declaration

    #include 
    int system(const char *command);

    2. 功能说明

    system 函数用于执行命令。它通过构建一个子进程,并在该子进程中调用 execFunction 来运行命令。system 函数简化了使用 exec 函数的过程。

    3. 使用方法

    system 函数接受一个完整的命令字符串,例如:

    system("clear");system("cat file.txt");

    4. 示例

    以下是使用 system 函数执行命令的示例:

    #include 
    #include
    #include
    char *cmd1 = "date";char *cmd2 = "/bin/cal";int main(void) { system("clear"); system(cmd1); sleep(1); system(cmd2); return 0;}

    5. 自定义 system 函数

    以下是模拟实现一个类似于 system Function 的函数:

    #include 
    #include
    #include
    #include
    void mysystem(char *cmd) { pid_t pid; if ((pid = fork()) < 0) { perror("fork error"); exit(1); } else if (pid == 0) { if (execlp("/bin/bash", "/bin/bash", "-c", cmd, NULL) < 0) { perror("execlp error"); exit(1); } } wait(0);}int main(void) { mysystem("clear"); mysystem("date > s1.txt"); mysystem("cal > s2.txt"); return 0;}

    总结

    exec 函数用于替代当前进程的主程序,通过调用 exec 系列函数来执行新程序。system 函数则提供了一种更高层次的接口,简化了使用 execFunction 的过程。理解这两个函数的使用方法,对于进程管理和系统编程具有重要意义。

    上一篇:数据结构_树
    下一篇:Linux学习_系统进程的wait()函数

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年05月20日 15时41分23秒