显然,在一个程序后面运行另一个程序的最简单的办法是把它们依次列入一个批处理文件中,在执行该批处理文件时,其中所列的程序就会依次运行。然而,这是一种人们已经知道的办法。
在c或DOS中,都没有一种特定的方法来完成“在一个程序结束后运行另一个程序”这样一种函数调用。然而,c提供了两组函数,它们允许一个程序随时可以运行另一个程序,而后者的运行将结束前者的运行。如果你将这样的一个函数调用放到第一个程序的末尾,你就能达到上述目的。C所提供的这两组函数实际上是由exec()和spawn()所代表的两个函数族,其中的每一个函数都具有一种区别于同族其它函数的功能。exec()函数族包括这样一些成员:execl(),execle(),execlp(),execlpe(),execv(),execve(),execvp()和execvpe()。下面列出了这此函数名中的e,l,p和v等后缀的含义:
e 明确地把一个指向环境参数的指针数组传递给子进程
l 把命令参数逐个传递给要执行的程序
p 通过环境变量PATH找到要执行的文件
v 把命令行参数以一个指针数组的形式传递给要执行的程序
在程序中选用哪一个函数完全取决于你以及要执行的程序的需要。下例中的程序调用了其参数由命令行指定的另一个程序:
# include <stdio.h>
# include <process.h>
char * envString[] = { /* environment for the app */
"COMM VECTOR=0x63", /* communications vector */
"PARENT=LAUNCH. EXE", /* name of this app */
"EXEC=EDIT. COM", /* name of app to exec */
NULL} ; /* must be NULL-terminated */
void
main(int argc, char **argv)
{
/* Call the one with variable argumets and an enviroffment */
_execvpe (" EDIT. COM", argv, envString ) ;
printf("If you can read this sentence, the exec didn't happen!\n") ;
}
上面这个短小的例子调用_execvpe()来执行DOS的文件编辑器EDIT.COM,EDIT程序的参数来自该例的命令行。在调用execvpe()函数后,上例中的程序就结束了;当EDIT程序退出时,你将返回到DOS提示符。如果printf()语句的打印内容显示在屏幕上,则说明_execvpe()函数调用出了问题,因为如果它调用成功,就不会有上述结果。注意,上例所提供的EDIT.COM的环境变量是没有任何意义的,然而,如果上例要执行一个需要环境变量的程序,那么所提供的环境变量就能供该程序使用了。
用spawn()函数同样可以完成上例所做的工作。spawn()函数族包括这样一些成员:
spawnl(),spawnle()。spawnlp(),spawnlpe(),spawnv(),spawnve(),spawnvp()和spawnvpe()。这些函数名中的e,l,p和v等后缀的含义与exec()族函数名中的相同。实际上,spawn()函数族与exec()函数族基本相同,只不过有一点小小的差别——spawn()函数既可以在结束原来的程序后启动另一个程序,也可以启动另一个程序并在该程序结束后返回到原来的程序。spawn()函数的参数与exec()函数的基本相同,只不过需要增加一个参数一你必须用_P_OVERLAY(结束原来的程序)或_P_WAIT(结束后返回到原来的程序)作为spawn()函数的第一个参数。下例用spawn()函数完成了与前面的例子相同的工作:
# include <stdio. h>
# include <process. h>
char * envString[] = { /* environment for the app */
"COMM VECTOR = 0x63", /* communications vector */
"PARENT=LAUNCH. EXE", /* name of this app */
"EXEC=EDIT. COM" , /* name of app to exec */
NULL} ; /* must be NULL-terminated */
void
main(int argc, char **argv)
{
/* Call the one with variable argumets and an environment */
_spawnvpe (_P_OVERLAY, "EDIT. COM", argv, envString) ;
printf("If you can read this sentence, the exec didn't happen!\n" );
}
这里唯一的区别是"exec”变为"spawn",并且增加了模式(mode)参数。spawn()函数有覆盖和等待两种相对立的功能,它使你可以在spawn()运行期间做出是等待还是离开的决定。实现上,P_WAIT参数回答了下一个问题。