Linux下execl学习

Linux下头文件

#include

函数定义

int execl(const char *path, const char *arg, ...);

函数说明

execl()其中后缀"l"代表list也就是参数列表的意思,第一参数path字符指针所指向要执行的文件路径, 接下来的参数代表执行该文件时传递的参数列表:argv[0],argv[1]... 最后一个参数须用空指针NULL作结束。

函数返回值

成功则不返回值, 失败返回-1, 失败原因存于errno中,可通过perror()打印

实例1:

root@wl-MS-7673:/home/wl/桌面/c++# cat -n execl.cpp

1 /* 执行 /bin/ls -al /ect/passwd */

2 #include /*** File: execl.c**/

3 #include

4 using namespace std;

5 int main()

6 {

7 // 执行/bin目录下的ls, 第一参数为程序名ls, 第二个参数为"-al", 第三个参数为"/etc/passwd"

8

9 if(execl("/bin/ls", "ls", "-al", "/etc/passwd", (char *) 0) < 0)

10

11 {

12 cout<<"execl error"<

13 }

14 else

15 {

16 cout<<"success"<

17 }

18 return 0;

19 }

root@wl-MS-7673:/home/wl/桌面/c++# g++ execl.cpp -o execl

root@wl-MS-7673:/home/wl/桌面/c++# ./execl

-rw-r--r-- 1 root root 1801 11月 28 09:46 /etc/passwd

root@wl-MS-7673:/home/wl/桌面/c++#

大家可以清楚的看到, 执行/bin目录下的ls, 第一参数为程序名ls, 第二个参数为"-al", 第三个参数为"/etc/passwd",但是没有输出success!!

这是为什么呢?

execl函数特点:

当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。

用另一个新程序替换了当前进程的正文、数据、堆和栈段。

当前进程的正文都被替换了,那么execl后的语句,即便execl退出了,都不会被执行。

再看一段代码:root@wl-MS-7673:/home/wl/桌面/c++# cat -n execl_test.cpp

1 #include

2 #include

3 #include

4

5 int main(int argc,char *argv[])

6 {

7 if(argc<2)

8 {

9 perror("you haven,t input the filename,please try again!n");

10 exit(EXIT_FAILURE);

11

12 }

13 if(execl("./file_creat","file_creat",argv[1],NULL)<0)

14 perror("execl error!");

15 return 0;

16 }

17

root@wl-MS-7673:/home/wl/桌面/c++# cat -n file_creat.cpp

1 #include

2

3 #include

4

5 #include

6 #include

7 #include

8 void create_file(char *filename)

9 {

10 if(creat(filename,0666)<0)

11 {

12 printf("create file %s failure!n",filename);

13 exit(EXIT_FAILURE);

14 }

15 else

16 {

17 printf("create file %s success!n",filename);

18 }

19 }

20

21 int main(int argc,char *argv[])

22 {

23 if(argc<2)

24 {

25 printf("you haven't input the filename,please try again!n");

26 exit(EXIT_FAILURE);

27 }

28 create_file(argv[1]);

29 exit(EXIT_SUCCESS);

30 }

31

32

root@wl-MS-7673:/home/wl/桌面/c++# g++ execl_test.cpp -o execl_test

root@wl-MS-7673:/home/wl/桌面/c++# g++ file_c

file_copy file_copy.cpp file_creat.cpp

root@wl-MS-7673:/home/wl/桌面/c++# g++ file_creat.cpp -o file_creat

root@wl-MS-7673:/home/wl/桌面/c++# ./execl_test

you haven,t input the filename,please try again!

: Success

root@wl-MS-7673:/home/wl/桌面/c++# ./execl_test file

create file file success!

root@wl-MS-7673:/home/wl/桌面/c++#

(0)

相关推荐

  • Unix和Linux下C语言学习指南

    尽管 C 语言问世已近 30 年,但它的魅力仍未减退。C 语言继续吸引着众多的开发者,他们为了编写、移植或维护应用程序而必须学习新技能。 本文是为了满足对C语言初学者或想提高自身C语言修为的开发人员的 ...

  • linux 中的MYSQL命令汇总 适合学习linux下配置mysql的朋友

    一、总结一下: 1.linux下启动mysql的命令: mysqladmin start /ect/init.d/mysql start (前面为mysql的安装路径) 2.linux下重启mysql ...

  • Linux下文件名.文件和mp3名字.pdf的乱码问题

    如果是刚刚从windows转到Linux下的,通常都会因为一些中文的问题而放弃,我就是这样装上,卸载搞过好几次,其实这种心态是永远都学不到东西的,真正的学者都具有一颗大无畏的精神,在他们的字典里是找不 ...

  • 如何在Linux下自学各类需要的知识

    安装好了Unix/Linux类操作系统,却不知道拿它做点什么、也不知道它能做些什么……这是大多数初这朋友的疑惑。 我认为首先要做的是学会如何在Unix/Linux下获得知识,掌握学习方法。如何真有一天 ...

  • Linux下ps命令的10个基本例子

    在Linux下ps命令是用于查看系统上运行的进程的最基本的命令之一。它提供了当前进程的同时,如用户ID,CPU使用率,内存使用率,命令名称等,它不显示实时数据,如top或htop命令的详细信息。但是, ...

  • Linux系统新手学习的11点建议

    随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起。这里介绍学习Linux的一些建议。 一、从基础开始:常常有些朋友在Linux论 ...

  • Linux下如何直接从硬盘启动Linux ISO镜像文件

    通常Linux启动Linux ISO镜像都要现将文件刻录到光盘或从USB驱动启动,下面小编就给大家介绍下Linux下如何直接从硬盘启动Linux ISO文件,一起来学习下吧。 我们在Ubuntu 14 ...

  • Linux下安装Cobbler以建立Linux网络安装环境

    Linux下使用cobbler可以快速建立Linux网络安装环境,大大降低了Linux网络安装的技术门槛,那么Linux系统要如何安装Cobbler呢?一起来学习下吧。 cobbler的简介 cobb ...

  • Linux下利用PC机进行路由转发将Linux变成一台路由器

    在Linux操作系统中,我们只要简单的设置就能将Linux变成一台优秀的路由器,实现路由转发,下面将通过三台机子的实现来给大家详细介绍下如何利用pc机来实现路由转发,一起来学习下吧。 1、网络拓扑 网 ...