当前位置:主页   - 电脑 - 程序设计 - C/C++
在一个程序后面运行另一个程序
来源:网络   作者:    更新时间:2010-09-26
收藏此页】    【字号    】    【打印】    【关闭

问:怎样在一个程序运行后面运行另一个程序? ●1、 在一个程序里面运行另一个程序的最简单的方法是把它们依次列入一个批处理文件(扩展名为.BAT的文件),在执行该批处理文件时,其中所列程序就会自动运行。
在C或DOS中,都没有一种特定的方法来完成“在一个程序结束后运行另一个程序”这样一种函数调用。然而,C提供了两组函数,它们允许一个程序随时可以运行另一个程序,而后者的运行将结束前者的运行。如果你将这样的函数调用放在第一个程序的末尾,就能达到上述目的。C提供的这两组函数是exec()和spawn()函数族,其中的每一个函数都具有一种区别于其它函数的功能。exec()函数族包含这样一些成员:execl()、execle()、execlpe()、execv()、execve()和execvpe()。下面列出了这中中的e,l,p和v等后缀的含义:
e 明确地把一个指向环境参数的指针数组传递给子进程
l 把命令参数上传递给要执行的程序
p 通过环境变量PATH找到要执行的函数
v 把命令行参数以一个指针数组的形式传递给要执行的程序
在程序中选用哪一个函数完全取决于你以及要执行的程序的需要。下例中的程序调用了其参数由命令行指定的另一个程序:
#include<sio.h>
#include<process.h>
char *envSing[]=
"COMM_VECTOR=0x63",
"PARENT=LAUNCH.EXE",
"EXEC=EDIT.COM",
NULL};

void main(int argc,char **argv)
{
_execvpe("EDIT.COM",argv,envSing);

printf("If you can read this sentence,the exec did'nt happen!\n");
}
上面这个短小的例子调用_execvpe()来执行DOS的文件编辑器EDIT.COM,EDIT程序的参数来自该例的命令行。在调用_execvpe函数后,上例中的程序就结束了EDIT程序退出时,你将返回到DOS提示符。如果printf语句的打印内容出现在屏幕上,则说明_execvpe()函数调用出了问题,因为如果它调用成功,就不会有上述结果。注意上例所提供的EDIT.COM的环境变量是没有任何意义的。然而如果上例要执行一个需要环境变量的程序,那么所提供的环境变量就能供给该程序使用了。
用spawn函数同样可以完成上例所做的工作。spwan()函数族包括这样一些成员:spawnl()、spawnle()、spawnlp()、spawnlpe()、spawnv()、spawnve()、spawnvp()和spawn()函数。这些函数名中的e,l,p,和v等后缀的含义与exec()函数族函数名中的相同。实际上,spawn()函数族与exec()函数族基本相同,只不过有一点小小的差别----spawn()函数既可以在结束原来的程序后启动另一个程序,也可以启动另一个程序并在该程序结束后返回到原来的程序中。spawn()函数的参数与exec()函数的基本相同,只不过需要增加一个参数----你必须用_P_OVERLAY(结束原来的程序)或_P_WAIT(结束后返回到原来的程序)作为spawn()函数的第一个参数。下例用spawn()函数完成了与前面的例子相同的工作:
#include<sio.h>
#include<process.h>
char *envSing[]={
"COMM_VECTOR=0x63",
"PARENT=LAUNCH.EXE",
"EXEC=EDIT.COM",
NULL};

void main(int argc,char **argv)
{
_spawnvpe(_P_OVERLAY,"EDIT.COM",argv,envSing);
printf("If can read this sentence,the exec did'nt happen!\n");
}
这里唯一区别是"exec"变为"spawn",并且增加了模式(mode)参数。spawn()函数有复盖和等待两种相对立的功能,它使你可以在spawn()运行期间做出是等待还是离开的决定,如果使用_P_WAIT,那么就是等待。

●2、还有一种方法可以完成在一个程序运行期间运行另一个程序,即使用system()函数。system()函数与前面讲的函数相似但也有不同的地方。除了挂起(而不是结束)当前程序去执行新的程序外,system()还需要启动COMMAND.COM命令翻译程序(或者其它任何运行在你的上命令翻译程序)。如果system()找不到COMMAND命令,那么它就不去执行所要求的程序(这一点与exec()或spawn()函数是不同的)下面的例子调用EDIT.COM编辑一个文件:
#include<sio.h>
#include<process.h>
#include<slib.h>

char argS[256];

void main(int argc,char **argv)
{
int ret;
sprintf(argS,"EDIT %s",(argv[1]==NULL?"HELLO":argv[1]));
ret=system(argS);
printf("system() returned %d\n",ret);
}
与上面的例子一样(使用_P_WAIT),在system()调用后面的printf()语句会执行。因为原来的程序只是挂起而不是终止。在每一种情况下,system()都会返回一个表示是否成功地运行了所指定的程序的值,而不会返回所指定的程序的返回值。

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明