
Linux学习_exec和system函数
发布日期:2021-05-14 23:43:02
浏览次数:16
分类:精选文章
本文共 3131 字,大约阅读时间需要 10 分钟。
分析 exec 函数和 system 函数
exec 函数
1. 概念
exec 函数是一种用以替代当前进程正文、数据堆和栈的函数。当调用 exec 时,当前进程会被新程序完全替代,新程序从 main 函数开始执行。exec 函数并不创建新进程,而是以另一个程序替换当前进程的代码和相关结构。
2. 函数原型
以下是 exec 系列函数的原型:
#includeint 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
#includeint 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 的过程。理解这两个函数的使用方法,对于进程管理和系统编程具有重要意义。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年05月20日 15时41分23秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
mapper.xml中mapper找不到问题
2025-04-11
Mapper映射文件(CRUD和主键id生成)
2025-04-11
Mapper映射文件传参(数组/集合)与#{}和${} 区别
2025-04-11
mapping文件目录生成修改
2025-04-11
MapReduce Java API-使用Partitioner实现输出到多个文件
2025-04-11
MapReduce Java API-多输入路径方式
2025-04-11
MapReduce Java API实例-排序
2025-04-11
MapReduce Java API实例-统计出现过的单词
2025-04-11
MapReduce Java API实例-统计单词出现频率
2025-04-11
MapReduce Java API实例-统计平均成绩
2025-04-11
MapReduce Kmeans聚类算法
2025-04-11
MapReduce与HDFS企业级优化
2025-04-11
MapReduce分布编程模型之函数式编程范式
2025-04-11
MapReduce实现二度好友关系
2025-04-11
MapReduce的思想
2025-04-11
MapReduce的模式、算法和用例
2025-04-11
MapReduce的编程思想(1)
2025-04-12
MapReduce程序依赖的jar包
2025-04-12
MapReduce程序(一)——wordCount
2025-04-12
MapReduce编程模型简介和总结
2025-04-12