Linux进程——exec族函数

1、为什么要使用exec族函数
当我们fork一个子进程就是为了执行一个新的程序,此时可以调用exec族函数,执行已经编译好的可执行程序或者Linux自带的ls、cd等命令。
2、exec族函数如何使用

函数原型:
#include <unistd.h> 
extern char **environ; 
int execl( const char *path, const char *arg, ...); 
int execlp( const char *file, const char *arg, ...); 
int execle( const char *path, const char *arg , ..., char * const envp[]); 
int execv( const char *path, char *const argv[]); 
int execvp( const char *file, char *const argv[]); 
参数说明:
path:可执行程序的路径名
arg:可执行性程序的参数,第一个arg是可执行性程序的文件名,第二个至最后一个arg是可执行性程序的参数,若没有参数必须以NULL结尾
file:可执行性程序的文件名
argv[]:可执行性程序的参数列表

3、exec族函数的理解比较
1)execl与execv:
execl是把参数列表依次写入arg中,本质上是多个字符串,必须以NULL结尾
execv是把参数列表存放到一个字符数组argv[]中,一块传参

2)execl与execlp:
execl传的是可执行性程序的路径名
execlp传的是可执行性程序的文件名,其路径是根据环境变量PATH底下的文件中查 找该文件名
相关环境变量指令:
whereis date 功能:查找date指令的绝对路径 /bin/date
echo $PATH 功能:当前环境变量
export PATH = $PATH:当前文件路径 功能:把当前文件路径放到环境变量中
环境变量说明:环境变量中的可执行性程序,可在任意文件夹下使用,敲写该文件 名便可执行可执行性程序,不用加 “ ./ ” 。
4、exevl函数demo说明

//demo.c
#include <stdio.h>
#include <unistd.h>
int main()
{
	 printf("before execl\n");
	 if(execl("./test","test","123",NULL)==-1)
 	 {
  		printf("execl failed\n");
  		perror("why");
	 }
	printf("after execl\n");//若execl函数成功执行,此语句将不在执行
}
//test.c
#include <stdio.h>
int main(int argc,char **argv)
{
 	int i;
	for(i = 0;i<argc;i++)
 	{
 	 	printf("argv[%d] is %s\n",i,argv[i]);
 	}
 	return 0;
}
//执行结果
before execl
argv[0] is test
argv[1] is 123

5、execlp函数demo说明

#include <unistd.h>
#include <stdio.h>
int main()
{
        printf("system date show\n");
        if(execlp("date","date",NULL)==-1)
        {
                printf("execlp failed\n");
        }
        return 0;
}
//执行结果
system date show
Thu Jul  2 17:48:17 CST 2020

6、execv函数demo说明

//函数原型:int execv( const char *path, char *const argv[]); 
#include <stdio.h>
#include <unistd.h>
int main()
{
        char *argv[] = {"ps","-aux",NULL};
        if(execv("/bin/ps",argv)==-1)
        {
                printf("execv failed\n");
        }
        return 0;
}
//执行结果
查看当前进程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值