进程控制开发之:Linux进程控制编程
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在内的各种数据结构,并终止本进程的运行。但是,这两个函数还是有区别的,这两个函数的调用过程如
进程控制 Linux fork() 函数 操作系统 相关文章:
- 进程控制开发之:Linux进程概述(08-13)
- 进程控制开发之:Linux守护进程(08-13)
- 进程控制开发之:实验内容(08-13)
- REDIce-Linux--灵活的实时Linux内核(11-12)
- linux文件系统基础(02-09)
- Linux标准趋向统一(11-12)