进程-exec函数族

(一)exec函数族
通过调用exec函数族实现让父子进程执行不同的程序,父进程不会受影响。
exec函数族,就是以exec为开头的函数,比如execl函数、execlp函数等,所以称它为exec函数族。

l(list) :命令行参数列表
p(path) :搜索file时的使用的path变量
v(vector矢量,载体):使用命令行参数数组
e(environment) :使用环境变量数组

注:
(1)在exec函数族中,一般fork创建子进程后,执行的是和父进程相同的程序,只是父子进程执行了不同的代码分支而已。子进程往往通过调用任意一个exec函数来执行另外一个程序,当子进程调用一种exec函数时,该子进程的用户空间代码和数据完全被新程序替换,并从新程序开始执行。但是调用的exec程序并不会创建新进程,所以调用exec前后该进程的ID并未改变
(2)exec函数族只是用磁盘上的一个新程序替换了当前进程的正文段、数据段、堆栈和栈段

(二)execl/execlp

int execl(const char *path, const char *arg, ...,**NULL**);
eg:
		execl("/bin/ls", "ls", "-al", "/etc/passwd",  (char *) 0);//NULL

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

int execlp(const char * file,const char * arg,……, NULL);
eg:
		execlp(“ls”,    ”ls”,”-al”,   ”/etc/passwd”,  (char *)0);//NULL

(1)execlp()函数:会从PATH 环境变量所指的目录中,查找符合参数file的文件名, 并执行该文件。然后将第二个以后的参数当做该文件的传参argv[0]、argv[1]……, 最后一个参数必须用空指针(NULL)作结束。

(2)返回值: 如果执行成功则函数不会返回,执行指定的程序,
执行失败则直接返回-1, 失败原因存于errno 中。

(三)execv/execvp

int execv(const char *pathname, char * const argv[]);

注:
(1)成功执行指定的程序,失败返回EOF
(2)argv封装成指针数组的形式

eg:
		·char * argv[ ] = {"ls", " -a", "-l", "/etc", NULL};
		 if (execv("/bin/ls", argv) == -1)
		 {
		 	perror(“execv fail”);
		 }

int execvp(const char *file ,char * const argv []);
eg:
		char * argv[ ] ={ “ls”,  ”-al”,  ” /etc/passwd”,  NULL};
		execvp(“ls”,argv);

(四) system

	 int system(char *command);

功 能:可以不替换,执行后面的程序。
实 质:fork了一个子进程去执行封装的exec函数
当前进程等待command执行结束后才继续执行

发布了13 篇原创文章 · 获赞 0 · 访问量 134

猜你喜欢

转载自blog.csdn.net/m0_46170433/article/details/104845005
今日推荐