新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 进程控制开发之:Linux进程控制编程

进程控制开发之:Linux进程控制编程

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257131.htm

此程序的运行结果与在shell中直接键入命令“ps-ef”是一样的,当然,在不同系统的不同时刻都可能会有不同的结果。

接下来的示例使用完整的文件目录来查找对应的可执行文件。注意目录必须以“/”开头,否则将其视为文件名。

/*execl.c*/

#includeunistd.h>

#includestdio.h>

#includestdlib.h>

intmain()

{

if(()==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(()==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(()==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()这个系统调用。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭