知识屋:更实用的电脑技术知识网站
所在位置:首页 > 操作系统 > linux

Linux下execl学习

发布时间:2014-09-05 17:45:03作者:知识屋

Linux下头文件

#include <unistd.h>

函数定义

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 <unistd.h>/*** File: execl.c**/     3	#include <iostream>     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"<<endl;    13	  }    14		else    15		{    16			cout<<"success"<<endl;    17		}    18	return 0;    19	}root@wl-MS-7673:/home/wl/桌面/c++# g++ execl.cpp -o execlroot@wl-MS-7673:/home/wl/桌面/c++# ./execl -rw-r--r-- 1 root root 1801 11月 28 09:46 /etc/passwdroot@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 <unistd.h>     2	#include <stdio.h>     3	#include <stdlib.h>     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 <stdio.h>      2	     3	#include <stdlib.h>      4	     5	#include <sys/types.h>      6	#include <sys/stat.h>      7	#include <fcntl.h>      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_testroot@wl-MS-7673:/home/wl/桌面/c++# g++ file_cfile_copy       file_copy.cpp   file_creat.cpp  root@wl-MS-7673:/home/wl/桌面/c++# g++ file_creat.cpp -o file_creatroot@wl-MS-7673:/home/wl/桌面/c++# ./execl_test you haven,t input the filename,please try again!: Successroot@wl-MS-7673:/home/wl/桌面/c++# ./execl_test filecreate file file success!root@wl-MS-7673:/home/wl/桌面/c++# 




(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜