进程创建方式与exec函数簇
Posted ZDF0414
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程创建方式与exec函数簇相关的知识,希望对你有一定的参考价值。
进程的两个基本元素: 1、程序代码; 2、与代码相关联的数据集 ********************************************************************************************************** 一、要创建一个子进程可以执行fork()系统调用。
![](https://image.cha138.com/20221212/e027f11fa7fd4ea6b000d6c0444be64f.jpg)
fork成功后,父子进程的执行顺序是不确定的,是由内核的调度算法决定的。 fork 的一个特性:父进程的所有打开文件描述符都被复制到子进程中。父子进程的每个 相同的打开描述符共享一个文件表项
fork 有下面两种用法: 1、父进程希望子进程执行自己的一个代码分支 2、fork成功后,调用exec函数簇,执行其它的代码(进程的程序替换)
fork 调用失败的原因: 1、 系统中有太多的进程 2、实际用户的进程数超过了限制 父子进程 之间的区别: 1. fork 的返回值 2. 进程 ID 不同 3. 具有不同的父进程 ID 4. 子进程的 tms_utime 、 tms_stime 、 tms_cutime 及 tms_ustime 均被设置为 0 5. 父进程设置的文件锁不会被子进程继承 6. 子进程的未处理闹钟被清除 7. 子进程的未处理信号集被设置为空集 ********************************************************************************************************** 二、 要创建一个子进程也可以执行 v fork()系统调用。
![](https://image.cha138.com/20221212/8ada9db2d42e47da9e2a5a8d0d98b04f.jpg)
当进程调用一种 exec 函数时 , 该进程 的用户空间代码和数 据完全被新程序替换 , 从新程序的启动例程开始执行。调用 exec 并 不创建新进程 , 所以调用 exec 前 后该进程的 id 并未改变。 其实有六种以 exec 开头的函数 , 统称 exec 函数: #include <unistd.h> int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg, ..., char *const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execve(const char *path, char *const argv[], char *const envp[]); 这些函数如果调用成功则加载新的程序从启动代码开始执行 , 不再返回 , 如果调用出错则 返回 -1, 所以 exec 函数只有出错的返回值,而没有成功的返回值。
不带字母 p ( 表示 path) 的 exec 函数 第一个参数必须是程序的相对路径或绝对路径 , 例如 "/bin/ls" 或 "./a.out", 而不能 是 "ls" 或 "a.out" 。对于带字母 p 的函数 : 如果参数中包含 /, 则 将其视为路径名。 否则视为不带路径的程序名 , 在 PATH 环境变量的目录列表中搜索这 个程序。
带有字母 l( 表示 list) 的 exec 函数 要求将新程序的每个命令行参数都当作一个参数传给 它 , 命令行参数的个数是可变的 , 因此函数原型中有 ...,... 中的 最后一个可变参数应该是 NULL , 起 sentinel 的作用。
带有字母 v( 表示 vector) 的函数 , 则应该 先构造一个指向各参数的指针数 组 , 然后将该数 组的首地址当作参数传给它 , 数组中的最后一个指针也应该是 NULL , 就像 main 函数 的 argv 参数或者环境变量表一样。
对于以e ( 表示 environment) 结尾的 exec 函数 , 可以把一份新的环境变量表传给它 , 其他 exec 函数 仍使用当前的环境变量表执行新程序。 ********************************************************************************************************** 四、进行进程程序替换函数的应用举例 (1) int execl(const char *path, const char *arg, ...);
![](https://image.cha138.com/20221212/8a026f5317a44414997677a59717d756.jpg)
![](https://image.cha138.com/20221212/90dfab510aa9402e84ff28b84473f9fa.jpg)
以上是关于进程创建方式与exec函数簇的主要内容,如果未能解决你的问题,请参考以下文章