目录
当子进程的工作不再是运行父进程的代码段,而是运行另一个新程序的代码,那么这个时候子进程可以通过 exec 函数来实现运行另一个新的程序。
为什么需要在子进程中执行新程序?虽然可以直接在子进程分支编写子进程需要运行的代码,但是不够灵活,扩展性不够好,直接将子进程需要运行的代码单独放在一个可执行文件中更好吗, 所以就出现了 exec 操作
execve()函数
系统调用 execve()可以将新程序加载到某一进程的内存空间,通过调用 execve()函数将一个外部的可执行文件加载到进程的内存空间运行,使用新的程序替换旧的程序,而进程的栈、数据、以及堆数据会被新程序的相应部件所替换,然后从新程序的 main()函数开始执行
代码1
定义俩个字符指针数组,再使用execve函数将当前进程替换为一个新程序,执行的程序文件的路径名argv[1],新进程的参数和环境变量将会被设置为arg_arr
和env_arr
中指定的值,如果execve
返回-1,表示执行失败,此时程序将打印一个错误消息,并以-1的返回值退出
代码2
打印程序的命令行参数和环境变量
验证
execl()函数运行 ls 命令
execv()函数运行 ls 命令
execl()和 execv()都是基本的 exec 函数,都可用于执行一个新程序,它们之间的区别在于参数格式不同;第一个参数参数意义和格式都相同, ,指向新程序的路径名,既可以是绝对路径、也可以是相对路径。 execl()和 execv()不同的在于第二个参数, execv()的是字符串指针数组; 而 execl()把参数列表依次排列,使用可变参数形式传递,本质上也是多个字符串,以 NULL 结尾
execlp()函数运行 ls 命令
execvp()函数运行 ls 命令
execle()函数运行 ls 命令
execvpe()函数运行 ls 命令
execle()和 execvpe()这两个函数在命名上加了一个 e,这个 e 其实表示的是 environment 环境变量,意味着这两个函数可以指定自定义的环境变量列表给新程序