必威体育Betway必威体育官网
当前位置:首页 > IT技术

系统调用execl

时间:2019-10-17 10:45:48来源:IT技术作者:seo实验室小编阅读:58次「手机版」
 

execl

系统调用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 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 调用成功,调用进程将被覆盖,然后从新程序的入口开始执行。这样就产生了一个新的进程,但是它的进程标识符与调用进程相同。

相关阅读

linux execl()函数

关于execl()函数族的用法不在赘述,其他博主介绍的很详细。下面说下作者在使用该函数时所犯的错误: 作者想通过使用execl()函数在子

分享到:

栏目导航

推荐阅读

热门阅读