这个系列是新开的apue阅读笔记系列。
前言
unix操作系统下,经常使用fork来创建子进程,而fork创建的子进程是完全复刻父进程的映像,如果我们想要执行另一个程序,可以使用exec函数族中的某个函数替换执行的程序,
exec函数族成员
exec函数族总共包含七个函数,他们都定义在unistd.h文件中,他们执行出错时均返回-1。
#include <unistd.h>
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 *)0, char *const envp[] */);
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execlp(const char *filename, const char *arg0,.../*(char *)0 */);
int execvp(const char *filename, char *const argv[]);
int fexecve(int fd, char* const argv[], char *const envp[]);
以上函数可以被分为三组,上面4个以路径名为参数,后两个以文件名为参数,最后一个以文件描述符为参数。但后两个函数中,如果filename中包含“/”,也视为路径名处理,否则在当前目录和环境变量下寻找对应的可执行文件。如果execlp或execvp中找到的可执行文件不是一个机器可执行文件,则认为是一个shell脚本,以filename为/bin/sh的shell输入。
也可以按照参数传入的方式将前六个函数分组,函数名中带有l的,说明每个参数都单独列出,如第1、3、5个函数,函数名中带有v的,说明参数以指针数组的形式列出,如第2、4、6个函数;函数名中带有e的,说明参数中包含了环境变量,这个参数使得加载新程序时替换原本的环境变量,如第3、4个函数;函数名中带有p的,说明根据filename来寻找可执行程序。
需要注意的是,对于第1、3、5个函数,在参数列表的末尾需要显式地添加(char*) 0作为参数列表的结尾,比如下面的代码:
#include <unistd.h>
#include <sys/wait.h>
#include <errno.h>
#include <bits/stdc++.h>
int main(){
pid_t pid;
if(pid = fork()<0){
std::cout << errno << std::endl;
return 0;
}
else if(pid==0){
if(execlp("exe","arg0","arg1",(char*) 0) < 0){
std::cout << errno << std::endl;
return 0;
}
}
if(waitpid(pid, nullptr, 0) < 0){
std::cout << errno << std::endl;
return 0;
}
return 0;
}
在执行exec函数族后,由于没有创建新进程,进程ID并不会改变,除此之外,信号屏蔽集和工作目录,进程组ID和会话ID,umask值等也不会改变,这些信息通常保存在内核空间中,而exec只是替换进程的堆栈、代码段和数据段等,但进程的有效用户ID可能会改变,这取决于被执行文件的设置。
内部调用关系
虽然exec函数组中有7个函数,但只有execve是系统调用,其余6个只是库函数,最终都使用execve系统调用,关系图如下:
参考文献
《Advanced Programming in the UNIX Environment》 --W.Richard Stevens
标签:const,函数,exec,int,char,参数 来源: https://blog.csdn.net/csy777777/article/details/116376526
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。