简介:
exec函数族提供了一个在进程中启动另外一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段,代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。
exec函数族的返回值:
exec函数族调用成功无返回,调用失败返回-1.
exec函数原型:
int execl(const char * path,const char * arg,…);
参数说明:
path:要执行的程序路径。
arg :程序的第0个参数,即程序名自身。相当于argv【0】。
... :命令行参数列表。调用相应程序时有多少命令行参数,就需要有多少个输入参数项。注意:在使用此类函数时,在所有命令行参数的最后应该增加一个空的参数项(NULL),表明命令行参数结束。
printfagrv.c程序文件如下:
#include <stdio.h>
int main (int agrc,char *agrv[])
{
int i;
for(i=0;i<agrc;i++)
{
printf("agrv[%d] = %s\n",i,agrv[i]);//打印命令行参数
}
return 0;
}
使用execl函数调用该程序文件:
#include <stdio.h>
#include <unistd.h>
int main ()
{
printf("before execl!\n");
if( execl("/home/lzw/processLesson/printfargv","printfargv","this","is","a","test",NULL) == -1)
{
printf("execl fail\n");
}
printf("after execl!\n");//如果execl执行成功,这句话是不会打印的。因为该进程被替换成新的进程。
return 0;
}
使用execl调用系统 ls 指令,先使用whereis指令查看 ls指令存放的路径。
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main ()
{
printf("before execl!\n");
if( execl("/bin/ls","ls","-l",NULL) == -1)
{
printf("execl fail\n");
perror("error:");
}
printf("after execl!\n");//如果execl执行成功,这句话是不会打印的。因为该进程被替换成新的进程。
return 0;
}
使用execl调用date指令,先用whereis查看date指令存放的位置
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main ()
{
printf("the system time is !\n");
if( execl("/bin/date","date",NULL) == -1)
{
printf("execl fail\n");
perror("error:");
}
printf("after execl!\n");//如果execl执行成功,这句话是不会打印的。因为该进程被替换成新的进程。
return 0;
}
环境变量的配置:
查看环境变量指令: echo $PATH
配置环境变量:export PATH= $PATH:/home/xxx/test(冒号后面的路径是你需要加的路径)