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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值