微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 进程控制开发之:Linux进程控制编程

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

时间:08-13 来源:3721RD 点击:

clp()函数。读者可以看到,这里的参数列表列出了在shell中使用的命令名和选项。并且当使用文件名进行查找时,系统会在默认的环境变量PATH中寻找该可执行文件。读者可将编译后的结果下载到目标板上,运行结果如下所示:

$ ./execlp

PID TTY Uid Size State Command

1 root 1832 S init

2 root 0 S [keventd]

3 root 0 S [ksoftirqd_CPU0]

4 root 0 S [kswapd]

5 root 0 S [bdflush]

6 root 0 S [kupdated]

7 root 0 S [mtdblockd]

8 root 0 S [khubd]

35 root 2104 S /bin/bash /usr/etc/rc.local

36 root 2324 S /bin/bash

41 root 1364 S /sbin/inetd

53 root 14260 S /Qtopia/qtopia-free-1.7.0/bin/qpe -qws

54 root 11672 S quicklauncher

65 root 0 S [usb-storage-0]

66 root 0 S [scsi_eh_0]

83 root 2020 R ps -ef

$ env

……

PATH=/Qtopia/qtopia-free-1.7.0/bin:/usr/bin:/bin:/usr/sbin:/sbin

……

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

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

/*execl.c*/

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

int main()

{

if (fork() == 0)

{

/*调用execl()函数,注意这里要给出ps程序所在的完整路径*/

if (execl("/bin/ps","ps","-ef",NULL) < 0)

{

printf("Execl error\n");

}

}

}

同样下载到目标板上运行,运行结果同上例。

下面的示例利用函数execle(),将环境变量添加到新建的子进程中,这里的"env"是查看当前进程环境变量的命令,如下所示:

/* execle.c */

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

int main()

{

/*命令参数列表,必须以NULL结尾*/

char *envp[]={"PATH=/tmp","USER=david", NULL};

if (fork() == 0)

{

/*调用execle()函数,注意这里也要指出env的完整路径*/

if (execle("/usr/bin/env", "env", NULL, envp) < 0)

{

printf("Execle error\n");

}

}

}

下载到目标板后的运行结果如下所示:

$./execle

PATH=/tmp

USER=sunq

最后一个示例使用execve()函数,通过构造指针数组的方式来传递参数,注意参数列表一定要以NULL作为结尾标识符。其代码和运行结果如下所示:

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

int main()

{

/*命令参数列表,必须以NULL结尾*/

char *arg[] = {"env", NULL};

char *envp[] = {"PATH=/tmp", "USER=david", NULL};

if (fork() == 0)

{

if (execve("/usr/bin/env", arg, envp) < 0)

{

printf("Execve error\n");

}

}

}

下载到目标板后的运行结果如下所示:

$ ./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()这个系统调用。

3.exit()和_exit()

(1)exit()和_exit()函数说明。

exit()和_exit()函数都是用来终止进程的。当程序执行到exit()或_exit()时,进程会无条件地停止剩下的所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。但是,这两个函数还是有区别的,这两个函数的调用过程如

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top