問:怎樣在一個程序運行後面運行另一個程序? ●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()都會返回一個表示是否成功地運行了所指定的程序的值,而不會返回所指定的程序的返回值。