进程控制开发之:Linux进程控制编程
此程序的运行结果与在shell中直接键入命令“ps-ef”是一样的,当然,在不同系统的不同时刻都可能会有不同的结果。
接下来的示例使用完整的文件目录来查找对应的可执行文件。注意目录必须以“/”开头,否则将其视为文件名。
/*execl.c*/
#includeunistd.h>
#includestdio.h>
#includestdlib.h>
intmain()
{
if(fork()==0)
{
/*调用execl()函数,注意这里要给出ps程序所在的完整路径*/
if(execl(/bin/ps,ps,-ef,NULL)0)
{
printf(Execlerrorn);
}
}
}
同样下载到目标板上运行,运行结果同上例。
下面的示例利用函数execle(),将环境变量添加到新建的子进程中,这里的“env”是查看当前进程环境变量的命令,如下所示:
/*execle.c*/
#includeunistd.h>
#includestdio.h>
#includestdlib.h>
intmain()
{
/*命令参数列表,必须以NULL结尾*/
char*envp[]={PATH=/tmp,USER=david,NULL};
if(fork()==0)
{
/*调用execle()函数,注意这里也要指出env的完整路径*/
if(execle(/usr/bin/env,env,NULL,envp)0)
{
printf(Execleerrorn);
}
}
}
下载到目标板后的运行结果如下所示:
$./execle
PATH=/tmp
USER=sunq
最后一个示例使用execve()函数,通过构造指针数组的方式来传递参数,注意参数列表一定要以NULL作为结尾标识符。其代码和运行结果如下所示:
#includeunistd.h>
#includestdio.h>
#includestdlib.h>
intmain()
{
/*命令参数列表,必须以NULL结尾*/
char*arg[]={env,NULL};
char*envp[]={PATH=/tmp,USER=david,NULL};
if(fork()==0)
{
if(execve(/usr/bin/env,arg,envp)0)
{
printf(Execveerrorn);
}
}
}
下载到目标板后的运行结果如下所示:
$./execve
PATH=/tmp
USER=david
(4)exec函数族使用注意点。
在使用exec函数族时,一定要加上错误判断语句。exec很容易执行失败,其中最常见的原因有:
n 找不到文件或路径,此时errno被设置为ENOENT;
n 数组argv和envp忘记用NULL结束,此时errno被设置为EFAULT;
n 没有对应可执行文件的运行权限,此时errno被设置为EACCES。
小知识 | 事实上,这6个函数中真正的系统调用只有execve(),其他5个都是库函数,它们最终都会调用execve()这个系统调用。 |
评论