开网站平台需要多少钱,河北中石化建设网站,小程序开发公司网站源码下载,常见的网站推广方式有哪些本文目录 一、exec函数簇介绍二、exec函数簇 一、exec函数簇介绍
exec 函数族的作用是根据指定的文件名找到可执行文件#xff0c;并用它来取代调用进程的内容#xff0c;换句话说#xff0c;就是在调用进程内部执行一个可执行文件。
exec函数族的函数执行成功后不会返回并用它来取代调用进程的内容换句话说就是在调用进程内部执行一个可执行文件。
exec函数族的函数执行成功后不会返回因为调用进程的实体包括代码段数据段和堆栈等都已经被新的内容也就是新的进程信息会替换原进程的“用户区”的信息取代只留下进程ID等一些表面上的信息仍保持原样比如PID、PPID、进程组号等这些在内核区的PCB中的信息颇有些神似“三十六计中的“金蝉脱壳”。看上去还是旧的躯壳却已经注入了新的灵魂。只有调用失败了它们才会返回-1从原程序的调用点接着往下执行。
二、exec函数簇
int execl(const char *path,const char *arg,.../* (char *) NULL */);
int execlp(const char *file,const char *arg,.../* (char *) NULL */);
int execle(const char *path,const char *arg,.../* (char *) NULL ,char * const envp[] */;int execv(const char *path,char *const argv[]);
int execvp(const char *file ,char *const argv[]);
int execvp(const char *file,char *const argv[], char *const envp[]);//前面几个都是标准c库的函数下面这个是linux的函数一般来说就最上面两个用的最多。
int execve(const char *filename,char *const argv[],char *const envp[]); l:list参数地址列表以空指针结尾。 v:vector存有各参数地址的指针数组的地址。 p:path按PATH环境变量指定的目录搜索可执行文件。 e:environment存有环境变量字符串地址的指针数组地址。
输入man 3 exec查看标准C库的文档解释
首先在某个文件夹下创建hello.c文件代码如下
#include stdio.hint main() { printf(hello, world\n);return 0;
}然后在同级文件夹下创建execl.c文件然后通过gcc exec.c -o exec进行编译。
/*#includeunistd.hint execl(const char *path, const char *arg, ...);参数-path需要指定的执行的文件路径或者相对路径的名称比如a.out 或者/home/linux/a.out执行a.out的时候可以传递一些参数所以后面都是可变参数-arg:是执行可执行文件需要的参数列表第一个参数一般没有什么作用为了方便一般写的是程序的名称、从第二个参数开始往后就是程序执行所需要的参数。参数最后需要以NULL结束哨兵。返回值只有出错的时候才会有返回值返回-1并且设置errno。如果调用成功没有返回值。为什么没有返回值因为用户区的内容已经被替换了。
*/#include unistd.h
#include stdio.h
#includesys/types.hint main() {// 创建一个子进程在子进程中执行exec函数族中的函数pid_t pid fork();if(pid 0) {// 父进程printf(我是父进程, pid : %d\n,getpid());sleep(1);}else if(pid 0) {// 子进程execl(hello,hello,NULL);//也可以试着跑一下系统的shell命令也就是ps aux查看进程的命令ps是可执行文件aux是参数。//execl(/bin/ps, ps, aux, NULL); }for(int i 0; i 3; i) {printf(i %d, pid %d\n, i, getpid());}return 0;
}运行./exec会发现输出了hello,world! 并且只有父进程在输出for循环子进程因为跳出实现另一个进程不会再往下执行了。 下面的execlp函数则是到环境变量输入env 即可查看环境变量可以看到ps的环境变量是/usr/local/bin所以下面的代码是可以成功找到ps并且执行的。中去找可执行文件所以不需要路径。
/* #include unistd.hint execlp(const char *file, const char *arg, ... );- 会到环境变量中查找指定的可执行文件如果找到了就执行找不到就执行不成功。- 参数- file:需要执行的可执行文件的文件名a.outps- arg:是执行可执行文件所需要的参数列表第一个参数一般没有什么作用为了方便一般写的是执行的程序的名称从第二个参数开始往后就是程序执行所需要的的参数列表。参数最后需要以NULL结束哨兵- 返回值只有当调用失败才会有返回值返回-1并且设置errno如果调用成功没有返回值。int execv(const char *path, char *const argv[]);argv是需要的参数的一个字符串数组char * argv[] {ps, aux, NULL};execv(/bin/ps, argv);*/
#include unistd.h
#include stdio.hint main() {// 创建一个子进程在子进程中执行exec函数族中的函数pid_t pid fork();if(pid 0) {// 父进程printf(i am parent process, pid : %d\n,getpid());sleep(1);}else if(pid 0) {// 子进程execlp(ps, ps, aux, NULL);printf(i am child process, pid : %d\n, getpid());}for(int i 0; i 3; i) {printf(i %d, pid %d\n, i, getpid());}return 0;
}