选择显示字体大小

怎样在一个程序后面运行另一个程序


  问:怎样在一个程序运行后面运行另一个程序? 

  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<stdio.h>
#include<process.h>
char *envstring[]=
    "comm_vector=0x63",
    "parent=launch.exe",
    "exec=edit.com",
    null};

void main(int argc,char **argv)
{
    _execvpe("edit.com",argv,envstring);

    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<stdio.h>
#include<process.h>
char *envstring[]={
        "comm_vector=0x63",
        "parent=launch.exe",
        "exec=edit.com",
        null};

void main(int argc,char **argv)
{
    _spawnvpe(_p_overlay,"edit.com",argv,envstring);
    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<stdio.h>
#include<process.h>
#include<stdlib.h>

char argstr[256];

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


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons