Linux多任务编程(三) exec函数族及其基础实验 - Linux系统
exec函数族
函数族说明 fork() 函数用于创建一个新的子进程,该子进程几乎复制了父进程的全 部内容,但是,这个新创建的子进程如何执行呢?exec 函数族就提供了一个在进程中启动另一个程序执行的 方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈 段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件 既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。 在 Linux 中使用exec函数族主要有 两种情况: 当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用 exec 函数族中的任意 一个函数让自己重生。 如果一个进程想执行另一个程序,那么它就可以调用 fork() 函数新建一个进 程,然后调用 exec 函数族中的任意一个函数,这样看起来就像通过执行应用程序而产生了一个新进程(这种 情况非常普遍)。 函数族语法 实际上,在Linux中并没有exec()函数,而是由6个以 exec 开头 的函数,它们之间的语法有细微差别。下表列出了 exec 函数族的6个成员函数的语法: 这6个函数在函数名和使用语法的规则上都有细微的区别,下面就从可执行文件查找方式、参数传递方式和环 境变量这几个方面进行比较。 查找方式:表1中的前4个函数的查找方式都是完整的文件目录路径,而 最后两个函数(也就是以 p 结尾的两个函数)可以只给出文件名,系统就会自动按照环境变量“$PATH” 所 指定的路径进行查找。 参数传递方式:exec函数族的参数传递有两种:一种是逐个列举的方式,而另 一种则是将所有参数整体构造指针数组传递。在这里是以函数名的第5位字母来区分的,字母为 "l"(list)的表示逐个列举参数的方式,其语法为const char *arg;字母为“v”(vector)的表示将 所有参数整体构造指针数组传递,其语法为 char *const argv[]。这里的参数实际上就是用户在使用这个可 执行文件时所需的全部命令选项字符串(包括该可执行程序命令本身)。要注意的是,这些参数必须以NULL结 束。 环境变量: exec函数族可以默认系统的环境变量,也可以传入指定的环境变量。这里以 “e” (environment)结尾的两个函数 execle()和 execve()就可以在 envp[]中指定当前进程所使用的环境变量。 表2再对这6个函数中的函数名和对应语法做了一个小结,主要指出了函数名中每一位对应所表明的含 义,以此表加以记住这6个函数。 事实上,这6个函数中真正的系统调用只有execve(),其他5个都是库函数,它们最终都会调用execve()这 个系统调用。在使用exec函数族时,一定要加上错误判断语句。exec 很容易执行失败,其中最常见的原因有 : ① 找不到文件或路径,此时 errno 被设置为 ENOENT。 ② 数组argv 和 envp 忘记用NULL结束,此时,errno被设置为 EFAUL。 ③ 没有对应可执行文件的运行 权限,此时 errno 被设置为EACCES。
(编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |