execl
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 execvpe(const char *file, char *const argv[],
char *const envp[]);
我们主要介绍 execl 函数,其它的几个函数基本都是基于 execl 的变形,大家可以自己查看man手册。
先看一段使用execl的程序示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
printf("主程序开始\n");
//调用exec
//execl的第一个参数为被调用程序的完整路径名
//从第二个参数开始,是传递给被调用程序的参数列表,并以NULL结束
execl("/bin/ls", "ls", "-al", NULL);
printf("主程序结束\n");
return 0;
}
//程序在本机的调用结果
simple@Precision:~/Code/linuxNetCode$ gcc test.cpp
simple@Precision:~/Code/LinuxNetCode$ ./a.out
主程序开始
总用量 52
drwxrwxr-x 3 simple simple 4096 Mar 27 10:04 .
drwxrwxr-x 6 simple simple 4096 Mar 23 21:50 ..
-rwxrwxr-x 1 simple simple 8848 Mar 27 10:04 a.out
-rw-rw-r-- 1 simple simple 569 Mar 27 10:04 test.cpp
simple@Precision:~/Code/LinuxNetCode$
通过输出结果可以看出来,在主程序中,两句打印语句printf
只执行了exec
调用之前的那一句。接着执行execl
函数,然后程序就结束了。那么主程序里的第二个打印语句为什么没有执行呢?
这是因为系统调用exec系列也是用于创建新的进程,然而,它与fork不同,fork函数是创建父进程的副本,而exec函数是调用已经存在的可执行程序。它们把一个新程序装入调用进程的内存空间,来改变调用进程的执行代码,从而形成新进程。
这就是说, exec 没有建立一个与调用进程并发的新进程,而是用新进程取代(覆盖)了原来的进程。如果 exec 调用成功,调用进程将被覆盖,然后从新程序的入口开始执行。这样就产生了一个新的进程,但是它的进程标识符与调用进程相同。
相关阅读
关于execl()函数族的用法不在赘述,其他博主介绍的很详细。下面说下作者在使用该函数时所犯的错误: 作者想通过使用execl()函数在子